2013-09-29 39 views
1

當我運行示例代碼時,wordLength是7(因此輸出7)。但是我的char數組最後得到了一些非常奇怪的字符。字符指針給我一些非常奇怪的字符

wordLength = word.length(); 

cout << wordLength; 

char * wordchar = new char[wordLength]; //new char[7]; ?? 

for (int i = 0; i < word.length(); i++) //0-6 = 7 
{ 
    wordchar[i] = 'a'; 
} 

cout << wordchar; 

輸出:7aaaaaaa²²²²|||||ÂD╩2|♀

所需的輸出是:AAAAAAA ...什麼是它背後的垃圾?它是如何在那裏結束的?

回答

1

用途: -

char * wordchar = new char[wordLength+1]; // 1 extra for null character

for循環之前和

wordchar[i] ='\0'

for循環後,C字符串是空終止。

如果沒有它,它會繼續打印,直到找到第一個空字符,打印所有垃圾值。

5

您應該在wordchar的末尾添加\0

char * wordchar = new char[wordLength +1]; 
//add chars as you have done 
wordchar[wordLength] = `\0` 

原因是C字符串是空終止的。

+0

是否因爲它是我自己需要做的動態字符? – user2141625

+0

不,正如其他帖子所示,這是因爲C字符串是空終止的,這意味着您需要在末尾添加'\ 0'來爲此目的服務。 – taocp

1

您避免了尾隨零,這是原因。

在C和C++中,整個生態系統處理字符串長度的方式是假定結尾零(數字上爲'\0'或簡單地0)。這與例如pascal字符串不同,其中存儲器表示以數字開始,該數字告知有多少個下一個字符構成特定字符串。

所以,如果你有一個特定的字符串內容你想存儲,你必須分配一個額外的字節爲尾隨零。如果你操縱內存內容,你將永遠不得不記住尾部零並保存它。否則strstr和其他字符串操作函數可以在運行時忽略內存內容,並繼續在以下內存部分工作。沒有尾隨零strlen也將給出一個錯誤的結果,它也計數,直到遇到第一個零。

你不是唯一犯這個錯誤的人,它經常在安全漏洞及其漏洞中扮演重要角色。利用利用副作用功能脫軌,並操縱其他東西,然後原來的目的。這是C的一個非常重要和危險的部分。您最好使用STL的std::string和STL方法而不是C風格的操作,在C++中(如您標記您的問題)。

3

C字符串以標記它們結尾的'\ 0'字符結尾(相反,C++ std::string只是單獨存儲長度)。

在複製的字符wordchar你沒有終止字符串,因此,當operator<<輸出wordchar,如此下去,直到它找到的第一個\0字符恰好是內存位置後wordchar指出,在該過程打印所有發生在內存之間的垃圾值。

要解決此問題,您應該:

  1. 使分配的字符串1字符長;
  2. 在最後加上\0字符。

不過,在C++中,您通常只想使用std::string

+0

+1爲STL,他標記C++ –