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

时间:2015-07-13 04:32:38

标签: c arrays string append

如何在速度方面改进此功能:

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

此外,遗憾的是,在数组的最开头附加一个字符也无效,这也是一个改进的方法。

2 个答案:

答案 0 :(得分:2)

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

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;
}

答案 1 :(得分:1)

使用@Dmitri评论在移动中包含空终结符'\0',而不是*(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. 内存管理:目前,假设空间存在。

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

  3. 检测pos何时位于字符串末尾。由于代码知道字符串长度,因此与#2相同。以特殊的方式处理简单的附加案例是合理的,以加快功能,因为它当然很常见。

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

  5. 字符串函数通常返回字符串地址。

  6. char == '\0'应该有特殊处理。除了转换之外,现有代码不起作用。移位,写入一个不需要的额外空字符。

  7. ...

    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 \0
        arr[len+1] = '\0';
      }
      return arr;
    }