一个有效地在字符串中附加字符的函数

A function to append a character in a string efficiently

如何提高此功能的速度:

void chrapp (char arr[], char chr, int pos)
{
    memmove(arr + pos + 1, arr + pos, strlen(arr + pos));
    *(arr + pos + 1) = chr;
}

此外,不幸的是,它无法在 数组 的最开头附加一个字符,这也是一种改进。

您的原始代码遍历字符串两次。一次用于计算字符串的长度,第二次用于移动它。您可以在一个循环中完成它,但是考虑到标准库函数是以高度优化的方式实现的,因此不确定它是否真的会加快速度。试试下面的代码:

void chrapp (char arr[], char chr, int pos) {
  char *s;
  char cc;
  for(s=arr+pos; *s; s++) {
     cc = *s; *s = chr; chr = cc;
  }
  *s++ = chr;
  *s = 0;
}

使用 @Dmitri 注释在移动中包含空终止符 '[=12=]'*(arr + pos) 而不是 *(arr + pos + 1)

void chrapp(char arr[], char chr, int pos) {
  memmove(arr + pos + 1, arr + pos, strlen(arr + pos) + 1);
  *(arr + pos) = chr;
}

还有其他问题:

  1. 内存管理:现在,假设 space 存在。

  2. 检测 pos 何时超过字符串结尾。在这种情况下,只需追加。如果没有这个测试,代码结果将是灾难性的。此时很容易将字符串大小添加到函数签名并检查它(未显示)。

  3. 检测pos何时在字符串末尾。由于代码知道字符串长度,因此执行与 #2 相同的操作。以一种特殊的方式处理简单的追加情况以加速该功能是合理的,因为它确实很常见。

  4. 使用更好的类型。 size_t,而不是 intint 而不是 char - 通常一样快或更快,而且肯定更惯用。

  5. 字符串函数常return字符串地址。

  6. char == '[=21=]' 应该有特殊处理。现有代码可以工作,但不需要转换。一个移位,写入一个额外的不需要的空字符。

...

char *chrapp2(char arr[], int chr, size_t pos) {
  size_t len = strlen(arr);
  if (pos < len) {
    // shift right
    memmove(arr + pos + 1, arr + pos, len - pos + 1);
    *(arr + pos) = chr;
  } else {
    arr[len] = chr;  // Over-write [=11=]
    arr[len+1] = '[=11=]';
  }
  return arr;
}