有效地将字符串插入另一个字符串
我有
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);