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

时间:2010-11-21 21:35:09

标签: c string insert character

我有

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

char bb[] = { "World" };

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

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:7)

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

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

#include <stdio.h>
#include <string.h>

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

#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 <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);

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

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

我希望这会有所帮助。

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:0)

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

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