2010-01-07 21 views
1

好吧,我真的很困惑這種行爲在VS2008。問題與字符數組的大小和strcat

此代碼..

char data[512] = ""; 

char c[1] = ""; 
c[0] = '1'; 

strcat(data, c); 

..在data結果被設置爲這個字符串值:1ÌÌÌÌhÿ

當然,它應該只是1

如何確保data只包含我複製到其中的單個字符[](即1)?

爲什麼strcat()複製所有的垃圾?爲什麼c甚至包含垃圾?

感謝所有幫助

編輯:感謝所有。

回答

12

這裏的問題是,你傳遞一個無效的值給strcat。它期望第二個參數是一個有效的C字符串值。爲了有效,它必須是以空終止符(\0)結尾的值爲char的數組/指針。您傳遞的值不包含空終止符,因此無效。

您需要定義字符串值c一個空結束纔有效。例如

char c[2]; 
c[0] = '1'; 
c[1] = '\0'; 
3

因爲strcat()複製了C字符串。 C字符串以'\ 0'結尾。所以當你複製'c'時,它會從內存開始,直到找到一個包含'\ 0'的內存位置,然後將所有這些複製到數據中。

你需要做的是確保「C」是一個真正的C字符串(「\ 0」結尾)

char c[2] = {}; // Sets all members to '\0'; 
c[0]  = '1'; // Sets c[0] to '1' but leaves c[1] as '\0' 

// c Is still a C-string as it is a sequence terminated with a '\0' character. 
3

不,它不應該是「只有1」。您的c數組不是C字符串,因爲您未能零終止它。當您將不是C字符串的內容傳遞給strcat時,行爲未定義。這是你在你的案例中觀察到的。

請注意,將一個串連的"1"擠成一個大小爲1的數組根本不可能。您需要至少包含2個字符的數組:一個用於'1'字符,另一個用於零終結符字符。

您可以將您的c聲明只是改變

char c[2] = ""; 

,並如預期的代碼就可以了(我理解你的意圖的方式)。