删除子字符串中给定位置的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; }
- 在循环中移位字符或
- copy chars example + 11..example + 20,paste at example + 4 OR
- ….
有任何想法吗?
我会准备一个并行数组,复制源数组中的所有字符,但忽略指定范围内的那些字符。 可选地,如果源arrays不在堆栈上,则可以释放源arrays使用的内存。
memmove(&example[5], &example[11], strlen(example) - 11 + 1);
请注意,当内存块重叠时, memcpy
的行为是未定义的,因此memmove
在这里更合适。