2011-01-29 25 views
6

使用GDB,我覺得我得到一個分段錯誤,當我嘗試這樣操作:strcat將字符串轉換爲字符串?

strcat(string,&currentChar); 

鑑於該字符串初始化爲

char * string = ""; 

和currentChar是

char currentChar = 'B'; 

爲什麼這會導致分段錯誤?

如果strcat不能用於這個,我怎麼能連接一個字符到一個字符串?

+3

strcat的要求空值終止字符串。你的單個字符沒有null,所以strcat將繼續複製,直到它找到一個空行,這可能是偶然的第二個字節,或者幾個千字節,一直拷貝所有垃圾到你的字符串中,跺腳堆棧 – 2011-01-29 02:52:51

回答

4

因爲&currentChar不是字符串,所以不會以\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"); 
+0

不是該程序的原因。這是錯誤的一部分,雖然 – 2011-01-29 03:00:15

+0

@Foo`&currentChar`不指向null終止字符串,當然strcpy會導致seg錯誤 – Elalfer 2011-01-29 03:03:58

+0

我接受這個答案,因爲它涵蓋了答:我需要空終止符,並且B:我不得不分配更多的空間來放置字符串。 – Blackbinary 2011-01-29 03:13:48

1

的strcat()有兩個「\ 0'結尾的字符串。當你傳遞一個字符的地址時,例程會查看字符後面的內存,尋找終止符。

由於您不知道該內存甚至指的是什麼,因此在代碼訪問時應該會遇到問題。

除此之外,您的字符串參數沒有空間可以添加任何字符。寫入內存的地方在哪裏?它將嘗試寫入超過與此字符串關聯的內存的末尾。

-1

這兩個字符串必須以空字符結尾。一個字符不是空終止的,所以當strcat停止將字符連接到結尾時它是未定義的。此外,字符串必須至少包含原始字符串和結果字符串的足夠空間。

這工作:

char string[10] = ""; 
char* currentChar = "B"; 
strcat(string, currentChar); 
-1

的strcat的第一個參數必須有足夠的空間來容納字符串的其餘部分。 「」是一個常量字符串,因此GCC不分配空間。

使它有足夠的空間的陣列:

char buf[1024]; 

strcat(buf, ""); 
strcat(buf, "B"); 
7

作爲迴應他人,& 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); 
0

我認爲最簡單的方法(效率不高)將sprintf

sprintf(str, "%s%c", str, chr);