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

我有

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

char bb[] = { "World" };

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

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

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

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

 #include  #include  

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

 #define MAX_STR_LEN 256 char aa[MAX_STR_LEN] = "Hello, !"; char bb[] = "World"; 

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

 size_t pos = 7; 

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

 size_t srclen = strlen(bb); 

memmove函数正确处理重叠的源和目标:

 // +1 for count to include terminating null memmove(aa+pos+srclen, aa+pos, strlen(aa)-pos+1); 

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

 memcpy(aa+pos, bb, srclen); 

现在aa包含结果。

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

 // additional include for malloc #include  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); 

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

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

我希望这有帮助。

 std::string aa = "Hello, !"; std::string bb = "World"; aa.insert(7, bb); 

不想使用C ++中的字符串

那你为什么要把它标记为C ++?

char * newStr = malloc(strlen(aa)+ strlen(bb));

sprintf(newStr,“%s%s”,aa,bb);