有效地将字符串插入另一个字符串

Pat*_*ski 2 c string insert character

我有

char aa[] = { "Hello, !" };

char bb[] = { "World" };

如何使用cstring将bb最有效地插入aa?

Let*_*_Be 10

  • 分配足够大的缓冲区(malloc/ new[])
  • 将aa字符串的第一部分复制到缓冲区(strncpy/ memcpy)
  • 复制bb字符串(strcpy/ memcpy)
  • 复制aa字符串的其余部分(strncpy/ memcpy)


jim*_*ark 7

最大化优化通常需要利用特定要求.您可以使代码不那么通用以获得速度(或其他一些指标).你可能知道你可以削减一些角落,而我们必须猜测.

下面的代码片段使用这些标头:

#include <stdio.h>
#include <string.h>
Run Code Online (Sandbox Code Playgroud)

如果你想最大限度地提高性能,那么为插入后的最终字符串预分配足够的空间会有所帮助:

#define MAX_STR_LEN 256 

char aa[MAX_STR_LEN] = "Hello, !";
char bb[] = "World";
Run Code Online (Sandbox Code Playgroud)

您没有说明如何知道插入的位置.对于我的示例代码,我将插入点定义为目标字符串的偏移量:

size_t pos = 7;
Run Code Online (Sandbox Code Playgroud)

如果你事先知道任何一个字符串长度,你应该使用const而不是调用strlen,它必须扫描字符串.在这里,我不认为你那么幸运.

size_t srclen = strlen(bb);
Run Code Online (Sandbox Code Playgroud)

memmove功能正确处理重叠的源和目标:

//  +1 for count to include terminating null
memmove(aa+pos+srclen, aa+pos, strlen(aa)-pos+1);
Run Code Online (Sandbox Code Playgroud)

memcpy 在某些平台上速度更快,可以安全地用于在字符串之间进行复制:

memcpy(aa+pos, bb, srclen);
Run Code Online (Sandbox Code Playgroud)

现在aa包含结果.

如果您无法预先分配aa到所需的大小,那么:

// additional include for malloc
#include <stdlib.h>

char aa[] = "Hello, !";
char bb[] = "World";
size_t pos = 7;    

size_t srclen = strlen(bb);
size_t dstlen = strlen(aa);
char *m = malloc(srclen+dstlen+1);
// Test for NULL or use an allocator that throws

memcpy(m, aa, pos);
memcpy(m+pos, bb, srclen);
memcpy(m+pos+srclen, aa+pos, dstlen-pos+1);
Run Code Online (Sandbox Code Playgroud)

m包含结果,可能需要free最终.

请记住,如果有任何缓冲区溢出的可能性,您必须检查长度以避免内存损坏和可能的安全漏洞.

我希望这有帮助.