2016-09-20 99 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