Let*_*_Be 10
malloc/ new[])strncpy/ memcpy)strcpy/ memcpy)strncpy/ memcpy)最大化优化通常需要利用特定要求.您可以使代码不那么通用以获得速度(或其他一些指标).你可能知道你可以削减一些角落,而我们必须猜测.
下面的代码片段使用这些标头:
#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最终.
请记住,如果有任何缓冲区溢出的可能性,您必须检查长度以避免内存损坏和可能的安全漏洞.
我希望这有帮助.