我有
char aa[] = { "Hello, !" };
char bb[] = { "World" };
如何使用cstring将bb最有效地插入aa?
答案 0 :(得分:10)
malloc
/ new[]
)strncpy
/ memcpy
)strcpy
/ memcpy
)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);