如何連接例如如何連接兩個字符串與許多空字符?
char s[5]={'s','a','\0','c','h'};
char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
,有許多空字符兩個字符串。我試過strcat()
。它不工作。有什麼辦法嗎?
如何連接例如如何連接兩個字符串與許多空字符?
char s[5]={'s','a','\0','c','h'};
char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
,有許多空字符兩個字符串。我試過strcat()
。它不工作。有什麼辦法嗎?
這很棘手,因爲根據定義,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
所有C標準庫字符串函數將在第一個\0
上停止。這是設計。事實上,你的輸入數組而不是可以很好地處理這些函數,因爲它們不會以\0
結尾。
所以最簡單的方法是使用memcpy
來代替,並指定要複製的字符數。不要忘記在目標緩衝區中分配必要的內存量。
如果它們不停在第一個NUL字節,它們不是字符串函數。這不是設計問題,而是C中字符串的約定/定義。 – Olaf
更直接的方式:
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);
目的地+ size_s爲第二個副本? – Bathsheba
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);
技術上,null結束了一個字符串。使用指針運算和'memcpy()' –
以空字符結尾的字符串只包含一個空字符,這顯然是字符串中的最後一個字符。 –
你的數組末尾缺少一個''0':eg:'{'s','a','\ 0','c','h'};' - >'{' S', 'A', '\ 0', 'C', 'H', '\ 0'};'。沒有這一點,你不能確定最後一個字符串的結束位置。其實你甚至需要兩個''\'0',所以你知道有更多的字符串。 –