0

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

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

有任何想法吗?

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

4

5 回答 5

4

您不能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)

于 2012-09-15T19:41:41.357 回答
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;
}
于 2012-09-15T19:48:09.273 回答
0
  1. 在循环中移动字符或
  2. 复制字符示例+11..示例+20,粘贴到示例+4 或
  3. ……
于 2012-09-15T19:10:47.230 回答
0

有任何想法吗?

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

于 2012-09-15T19:11:27.050 回答
0
memmove(&example[5], &example[11], strlen(example) - 11 + 1);

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

于 2012-09-15T20:32:58.317 回答