假设我有一个char *example
包含 20 个字符的。我想从 to 中删除每个字符example[5]
,example[10]
然后修复数组,以便example[11]
在example[4]
.
基本上将删除区域之后的所有字符移动到删除区域开始时。
有任何想法吗?
编辑:我认为可能有一种使用 memcpy 的方法?但我不知道该怎么做。
您不能memcpy()
可靠地使用,因为源和目标之间存在重叠;你可以使用memmove()
. 由于您知道长度,因此您可以使用:
memmove(&example[5], &example[11], (20 - 11 + 1));
请记住,您也需要复制空终止符。
#include <string.h>
#include <stdio.h>
int main(void)
{
char array[] = "abcdefghijklmnopqrst";
char *example = array;
printf("%.2zu: <<%s>>\n", strlen(example), example);
memmove(&example[5], &example[11], (20 - 11 + 1));
printf("%.2zu: <<%s>>\n", strlen(example), example);
return(0);
}
使用 C99 编译器编译,产生:
20: <<abcdefghijklmnopqrst>>
14: <<abcdelmnopqrst>>
如果您有 C89 编译器(更具体地说,是 C 库),您将不得不担心z
格式字符串中的 ,它表示size_t
参数。最简单的方法是删除并转换withz
的结果。strlen()
(unsigned)
剧透:
void cut_the_string(char *str, size_t cutpos, size_t cutlen)
{
size_t len;
len = strlen(str);
if (cutpos >= len) return;
if (cutpos + cutlen > len) cutlen = len-cutpos;
memmove( str+cutpos, str+cutpos+cutlen, 1+len - cutpos - cutlen);
return;
}
有任何想法吗?
我会准备一个并行数组,从源数组中复制所有字符,但忽略指定范围内的那些字符。或者,如果源数组不在堆栈上,可以释放它使用的内存。
memmove(&example[5], &example[11], strlen(example) - 11 + 1);
请注意,memcpy
当内存块重叠时, 的行为是未定义的,因此memmove
在这里更合适。