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

C 将一个字符串有效地插入到另一个字符串中,c,string,insert,character,C,String,Insert,Character,我有 char aa[]={“你好,!”} charbb[]={“世界”} 如何使用cstring最有效地将bb插入aa? 分配足够大的缓冲区(malloc/new[]) 将aa字符串的第一部分复制到缓冲区(strncpy/memcpy) 复制bb字符串(strcpy/memcpy) 复制aa字符串的其余部分(strncpy/memcpy) 不想使用C中的字符串++ P>为什么你把这个标记为C++? 最大优化通常需要利用特定的需求。您可以降低代码的通用性以获得速度(或其他指标)。你可能知道一

我有

char aa[]={“你好,!”}

charbb[]={“世界”}

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

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


<> P>为什么你把这个标记为C++?

最大优化通常需要利用特定的需求。您可以降低代码的通用性以获得速度(或其他指标)。你可能知道一些可以切入的角落,而我们不得不猜测

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

#include <stdio.h>
#include <string.h>
您没有指明如何知道在何处插入。对于示例代码,我将插入点定义为目标字符串的偏移量:

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);
//malloc的附加包括
#包括
char aa[]=“你好;
char bb[]=“世界”;
尺寸=7;
尺寸=标准长度(bb);
尺寸=标准长度(aa);
char*m=malloc(srclen+dstlen+1);
//测试NULL或使用引发
memcpy(m、aa、pos);
memcpy(m+pos、bb、srclen);
memcpy(m+pos+srclen、aa+pos、dstlen pos+1);
m
包含结果,可能最终需要
免费

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

我希望这能有所帮助。

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


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

为什么您宁愿使用cstring?为什么您同时拥有
C
C++
标记?听起来这是一个C++问题,不是一个C问题?@格洛里安:你是在调试还是发布模式下测量?”Glorian:我敢打赌你是在优化错误的代码。如果你真的想使用STRCMP那么多,那么使用C++字符串和DeCase> STRCMP(A.CyString),B.CyString())< /C>或<代码> Apple(Buy)< /C>不过,我敢打赌,字符串比较不是问题。我把标签删除到C++。这似乎是多余的。虽然他可能使用C++,如果他不打算使用任何C++特性,基本上是C。这真的很有帮助+1为了传递信息的清晰性
memcpy(aa+pos, bb, srclen);
// 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);