2013-02-05 53 views
0

我有一個程序,讀取包含列表的.dat文件:讀取字符顯示所有的字符,隨後一些垃圾字符

removepeer 452 
addpeer 6576 
removepeer 54245 

在某些時候,它讀出垃圾文字:H

這裏是我的代碼的一部分,我發現故障:

getline(abc, info, '\n'); //data here displays pretty fine 

int count = info.size(); 

char text[count]; 

for(int a=0; a<count; a++){ 
    text[a] = data[a]; 
} 
cout << text << endl; //Some rubbish text found in some printout! 

它打印出的最後一行其次是一些垃圾文字

+0

問題幾乎可以肯定是一個沒有終止的字符串,但是什麼是'數據'?數據[a]'保證在該對象的範圍之內嗎?爲什麼不直接打印'info'? –

回答

4

text數組不會被空終止,這在使用operator<<char[]時是必需的,因爲它們被視爲空終止的c樣式字符串。內存中的隨機字符將被寫入,直到偶然找到空終止符。從技術上講,超出數組邊界的訪問是未定義的行爲。

要更正,請將空終止符附加到text。當你的編譯器作爲一個擴展變長數組(這不是標準C++,但在C99),你可以將其更改爲:

char text[count + 1]; 

// snip... 

text[count] = 0; 

話雖如此,我不清楚爲什麼你從std::string複製實例爲char[]std::string實例也可以使用operator<<寫入流。

+0

是的,VLA是一個C99功能。一些C++編譯器支持它們作爲擴展。 –

+0

@JonathanWakely,歡呼聲。 – hmjd