删除子字符串中给定位置的C中的子字符串

假设我有一个包含20个字符的char *example 。 我想删除example[5]example[10]中的每个字符,然后修复数组,以便example[11]紧跟在example[4]

基本上将删除区域后的所有字符移动到删除区域开始时。

有任何想法吗?

编辑:我认为使用memcpy可能有一种方法? 但我不知道该怎么做。

您不能可靠地使用memcpy()因为源和目标之间存在重叠; 你可以使用memmove() 。 既然你知道长度,你使用:

 memmove(&example[5], &example[11], (20 - 11 + 1)); 

请记住,您也需要复制空终止符。

 #include  #include  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: <> 14: <> 

如果您有C89编译器(更具体地说,C库),您将不得不担心格式字符串中的z ,这表示size_t参数。 删除z并使用(unsigned) strlen()的结果是最简单的。

扰流板:

 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; } 
  1. 在循环中移位字符或
  2. copy chars example + 11..example + 20,paste at example + 4 OR
  3. ….

有任何想法吗?

我会准备一个并行​​数组,复制源数组中的所有字符,但忽略指定范围内的那些字符。 可选地,如果源arrays不在堆栈上,则可以释放源arrays使用的内存。

 memmove(&example[5], &example[11], strlen(example) - 11 + 1); 

请注意,当内存块重叠时, memcpy的行为是未定义的,因此memmove在这里更合适。