寻找一种更好的插入C-Style String的算法(char *)

时间:2017-06-09 18:11:28

标签: c arrays string insert

插入char *缓冲区(C字符串)的适当算法应该是什么?

我目前正在使用下面描述的内容以及我用来实现这些功能的函数(来自C库) 这里我说的是C样式字符串,而不是C ++字符串。我不被允许使用它。

  • 给定一个N长度的字符串S1插入到位置P
  • 的长度为M的另一个字符串S2中
  • 分配一个M + N + 2长度// malloc
  • 的临时字符串tmp
  • 同样重新分配S2,其中M + N + 2长度为// realloc
  • 检查分配和重新分配是否成功
  • 将S2复制到tmp,直到P // memmove
  • 连接S1和Tmp // strcat
  • 连接S2 + P和Tmp // strcat
    我使用strcat但是使用大型数组会产生访问(写入)违规(strcat)所以我必须编写自己的strcat实现,它工作正常,我完全不知道它为什么会这样做(访问) strcat违规)。
  • 用Tmp // memmove
  • 覆盖S2

这是有效的,但我正在处理大字符串,所以我正在寻找 任何方式来删除tmp和其他任何更好的 替代我正在使用的功能。此外,还有其他任何速度优化,因为我将使用它很多?

1 个答案:

答案 0 :(得分:0)

如果要调整目标字符串S2的大小,则根本不需要其他缓冲区。

一种可能性是:

  1. Realloc to M + N + 1 - 每个字符串中的字符数以及终止NUL中的字符数。
  2. 允许可能的重叠,使用memmove(不是memcpy)将所有内容从P:N + 1(包括原始尾随NUL)转移到缓冲区的末尾。
  3. 将M个字符从S1复制到从P开始的空格。没有重叠,因此memcpy可以正常工作。不要在这里使用strcpy - 您不希望在目标字符串的中间添加终止NUL。
  4. 就个人而言,我更愿意分配一个正确大小的新缓冲区,而不是重新分配现有的缓冲区。部分是因为它可以避免在P之后执行字符串部分的双重复制,但主要是为了避免破坏输入字符串,或者只是在没有被malloc分配时崩溃。

    对于步骤2,使用void *memmove(void *dest, const void *src, size_t n);,您需要将范围P:N + 1移动到从P + M开始的新位置,所以:

    memmove(S2 + P + M, S2 + P, N - P + 1);
    

    假设目标字符串为9个字符加上1个NUL终止符(N = 9),插入的字符串为2个字符(M = 2),插入位置为7(P = 7),这将移动9 - 7 + 1 =从位置7到位置7 + 2 = 3的3个字节,使位置7和8可以自由地保存要插入的字符串中的2个新字符。