如何连接两个字符串与许多空字符?

时间:2016-09-20 16:13:43

标签: c concatenation memcpy

如何连接两个字符串,例如

char s[5]={'s','a','\0','c','h'};

char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'};

有许多空字符。我试过了strcat()。它不起作用。有什么办法吗?

4 个答案:

答案 0 :(得分:4)

这很棘手,因为根据定义,C字符串是以空值终止的。所以你真正拥有的是两个字节缓冲区,你想要放在一起,而不是两个字符串。 (这就是为什么像strcat这样的函数在这里不起作用的原因 - 顺便说一下 - 他们希望它们的参数是C字符串。)

由于您无法使用空字符来告诉您缓冲区的结束方式,因此您需要事先了解缓冲区的大小。然后就像将二者咬合成一个缓冲区一样简单:

char dest[16];
memcpy(dest,     s, 5);  // Copy s to the final buffer
memcpy(dest + 5, m, 11); // Copy m to the final buffer just after s

答案 1 :(得分:0)

所有C标准库字符串函数将在第一个\0上停止。这是设计的。事实上,你的输入数组可以很好地处理这些函数,因为它们不会以\0结束。

因此,最简单的方法是使用memcpy代替,并指定自己复制的字符数。不要忘记在目标缓冲区中分配必要的内存量。

答案 2 :(得分:0)

更直接的方式:

const int size_s = 5;
const int size_m = 11;
char s[size_s]={'s','a','\0','c','h'};
char m[size_m]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
char destination[size_s+size_m];
int i;
for (i = 0;i < size_s;i++)
    destination[i] = s[i];

for (i = 0;i < size_m;i++)
    destination[i+size_s] = m[i];

理想情况下,您应该使用memcpy

const int size_s = 5;
const int size_m = 11;
char s[size_s]={'s','a','\0','c','h'};
char m[size_m]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
char destination[size_s+size_m];

memcpy(destination,s,size_s);
memcpy(destination,m,size_m);

答案 3 :(得分:0)

char s[5]={'s','a','\0','c','h'};
char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
char* e = (char*)malloc(sizeof(s) + sizeof(m));

memcpy(e, s, sizeof(s));
memcpy(&e[sizeof(s)], m, sizeof(m));

完成后不要忘记删除结果字符串。

free(e);