使用GDB,我覺得我得到一個分段錯誤,當我嘗試這樣操作:strcat將字符串轉換爲字符串?
strcat(string,¤tChar);
鑑於該字符串初始化爲
char * string = "";
和currentChar是
char currentChar = 'B';
爲什麼這會導致分段錯誤?
如果strcat不能用於這個,我怎麼能連接一個字符到一個字符串?
使用GDB,我覺得我得到一個分段錯誤,當我嘗試這樣操作:strcat將字符串轉換爲字符串?
strcat(string,¤tChar);
鑑於該字符串初始化爲
char * string = "";
和currentChar是
char currentChar = 'B';
爲什麼這會導致分段錯誤?
如果strcat不能用於這個,我怎麼能連接一個字符到一個字符串?
因爲¤tChar
不是字符串,所以不會以\0
字符結束。您應該將B
定義爲char *currentChar = 'B';
。也根據http://www.cplusplus.com/reference/clibrary/cstring/strcatstring
應該有足夠的空間來容納結果字符串(在這種情況下是2個字節),但它只有1個字節。
或者,如果你想使用char
那麼你可以做一些事情(這取決於你的代碼中),如:
char string[256];
...
char currentChar = 'B';
size_t cur_len = strlen(string);
if(cur_len < 254) {
string[cur_len] = currentChar;
string[cur_len+1] = '\0';
}
else
printf("Not enough space");
不是該程序的原因。這是錯誤的一部分,雖然 – 2011-01-29 03:00:15
@Foo`&currentChar`不指向null終止字符串,當然strcpy會導致seg錯誤 – Elalfer 2011-01-29 03:03:58
我接受這個答案,因爲它涵蓋了答:我需要空終止符,並且B:我不得不分配更多的空間來放置字符串。 – Blackbinary 2011-01-29 03:13:48
的strcat()有兩個「\ 0'結尾的字符串。當你傳遞一個字符的地址時,例程會查看字符後面的內存,尋找終止符。
由於您不知道該內存甚至指的是什麼,因此在代碼訪問時應該會遇到問題。
除此之外,您的字符串參數沒有空間可以添加任何字符。寫入內存的地方在哪裏?它將嘗試寫入超過與此字符串關聯的內存的末尾。
這兩個字符串必須以空字符結尾。一個字符不是空終止的,所以當strcat停止將字符連接到結尾時它是未定義的。此外,字符串必須至少包含原始字符串和結果字符串的足夠空間。
這工作:
char string[10] = "";
char* currentChar = "B";
strcat(string, currentChar);
的strcat的第一個參數必須有足夠的空間來容納字符串的其餘部分。 「」是一個常量字符串,因此GCC不分配空間。
使它有足夠的空間的陣列:
char buf[1024];
strcat(buf, "");
strcat(buf, "B");
作爲迴應他人,& currentChar是指向炭或字符*,但在C的字符串是的char [ ]或const char *。
一種方法使用的strcat來連接一個焦炭到串是創建一個最小字符串,並用它來一個字符轉換成字符串。
實施例:
製作一個簡單的字符串,只有1個字符和後綴'\ 0';
char cToStr[2];
cToStr[1] = '\0';
應用到你的問題:
char * string = "";
char currentChar = 'B';
cToStr將承擔字符串 「B」:
cToStr[0] = currentChar;
而且strcat的將工作!
strcat (string, cToStr);
我認爲最簡單的方法(效率不高)將sprintf
sprintf(str, "%s%c", str, chr);
strcat的要求空值終止字符串。你的單個字符沒有null,所以strcat將繼續複製,直到它找到一個空行,這可能是偶然的第二個字節,或者幾個千字節,一直拷貝所有垃圾到你的字符串中,跺腳堆棧 – 2011-01-29 02:52:51