2016-09-20 102 views
0

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

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

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

,有许多空字符两个字符串。我试过strcat()。它不工作。有什么办法吗?

+3

技术上,null结束了一个字符串。使用指针运算和'memcpy()' –

+2

以空字符结尾的字符串只包含一个空字符,这显然是字符串中的最后一个字符。 –

+0

你的数组末尾缺少一个''0':eg:'{'s','a','\ 0','c','h'};' - >'{' S', 'A', '\ 0', 'C', 'H', '\ 0'};'。没有这一点,你不能确定最后一个字符串的结束位置。其实你甚至需要两个''\'0',所以你知道有更多的字符串。 –

回答

4

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

由于您不能使用空字符来告诉您缓冲区在哪里结束你可以用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 
+0

Upvoted用于提供实现。 – Bathsheba

+0

谢谢。它真的工作 – Abu

0

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

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

+1

如果它们不停在第一个NUL字节,它们不是字符串函数。这不是设计问题,而是C中字符串的约定/定义。 – Olaf

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); 
+1

目的地+ size_s为第二个副本? – Bathsheba

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); 
+0

比我的回答稍微清洁一些,但要注意数组上的sizeof与指针上的sizeof不同(并且通常在处理缓冲区时,您将不会有实际的数组,只是指向其第一个元素的指针)。 – Cameron

+1

'new char' ....'delete [] e;'in C?怎么样? –

+0

我知道,我只是尽量写尽可能少的代码。我不明白他为什么要这样做,即使他有一个很好的理由,我会以比这更安全的方式做到这一点。 – Sam