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

时间:2012-09-15 19:06:52

标签: c arrays string char substring

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

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

有什么想法吗?

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

5 个答案:

答案 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)

  1. 在循环中移动字符或
  2. 复制字符示例+ 11..example + 20,粘贴示例+ 4 OR
  3. ....

答案 3 :(得分:0)

  

有什么想法吗?

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

答案 4 :(得分:0)

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

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