假设我有一个包含20个字符的char *example
。我想删除example[5]
到example[10]
的每个字符,然后修复数组,以便example[11]
在example[4]
之后。
基本上将删除区域后的所有字符移动到删除区域开始时。
有什么想法吗?
编辑:我认为使用memcpy可能有办法吗?但我不知道该怎么做。答案 0 :(得分:3)
您无法可靠地使用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
参数。删除z
并将strlen()
的结果与(unsigned)
一起投放是最简单的。
答案 1 :(得分:1)
扰流器:
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;
}
答案 2 :(得分:0)
答案 3 :(得分:0)
有什么想法吗?
我会准备一个并行数组,复制源数组中的所有字符,但忽略指定范围内的那些字符。可选地,如果源阵列不在堆栈上,则可以释放源阵列使用的内存。
答案 4 :(得分:0)
memmove(&example[5], &example[11], strlen(example) - 11 + 1);
请注意,当内存块重叠时,memcpy
的行为未定义,因此memmove
更合适。