2010-01-10 200 views
3

我試圖在C++中讀取一個字符的緩衝區,直到'\ n',並使用do-while循環初始化帶有這些字符的char數組。我知道我可以使用cin.getline(),但我想自己嘗試一下。讀取緩衝區C++

int main() 
{ 
    char buffer [1024]; 
    int index = 0; 
    char temp; 

    do 
    { 
     cin.get(temp); 
     buffer [ index ] = temp; 
     index ++; 
    } 
    while (temp != '\n'); 

    cout << buffer << endl; 

    return 0; 
} 

它給了我不正確的結果 - 正確的文字休閒幾行方括號與其他奇怪的符號混合。

+0

順便說一句,'std :: getline()'比'std :: istream :: getline()'更簡單,因爲後者要求你提前選擇緩衝區大小。 – jamesdlin 2010-01-10 20:02:25

回答

5

起初,整個文本後,你必須追加'\0'作爲字符串

的到底應該看起來像buffer[ index ] = 0;因爲你應該重寫你追加太貴\n角色。

當然,還有其他的東西,你應該檢查,但他們都不是你的主要問題

  • 長度的輸入,因爲你只有有限的緩衝區 - 最大長度爲1023 +空字節的
  • 結束標準輸入cin.eof()
+0

+1我會這樣做,因爲它更清楚地表明ZT已經完成(你不需要查找整個緩衝區已被設置爲「0」) – epatel 2010-01-10 20:01:06

3

您不是零分隔您的緩衝區。

嘗試的第一行只有最後一個字符改爲

char buffer[1024] = ""; 

這將buffer所有字符設置爲0,或者,設置爲0,通過之後做

buffer[index] = 0; 

循環。

另外,(正如其他人指出的)如果文本長度超過1024個字符,則會產生緩衝區溢出錯誤 - 這是軟件中最常見的導致安全問題的原因之一。

+0

你確定'char buffer [1024] =「」;'將所有字符設置爲0嗎?它不等於'char buffer [0] = 0;'?我不知道,我在問。我相信,這將所有字符設置爲0'char buffer [1024] = {0};' – Gaim 2010-01-10 20:05:52

+0

是的,我確定。 「如果大括號包含的列表中的初始化器數量少於聚合的元素或成員數量,或者用於初始化比數組中的元素大小的數組的字符串字符串中的字符數更少,則聚合的其餘部分應該被隱式地初始化爲具有靜態存儲持續時間的對象。「見例如http://stackoverflow.com/questions/453432/difference-in-initalizing-and-zeroing-an-array-in-c-c – 2010-01-10 20:10:16

+0

(回覆刪除的評論)不,它不。請閱讀我所引用的和谷歌一些。這將**整個數組**設置爲零。準確地說:*字符串文字中的*或更少的字符*(這是真的,因爲有0 <1024個字符)*用於初始化已知大小的數組* *(= 1024)*聚合的其餘部分應隱式地初始化與具有靜態存儲持續時間*的對象相同(這是零,因爲靜態數組已初始化爲全零)。 – 2010-01-10 20:41:56

0

當你到達一個換行符時,你停止填充緩衝區,所以剩下的部分是未初始化的。您可以通過以下方式對緩衝區進行初始化:char buffer[1024] = {0};這將解決您的問題。

2

兩件事情:

  1. 如果線的長度你 讀數超過1024,你寫過去 這是壞的緩衝區。
  2. 如果長度在 的限制範圍內,則不會終止使用空字符的 字符串。

您可以嘗試以下方法。這樣,如果你發現超過緩衝區大小的罰款,我們截斷它,並且在循環的末尾添加空字符。

#define MAX 1024 

int main() 
{ 
char buffer [MAX]; 
int index = 0; 
char temp; 

do 
{ 
    // buffer full. 
    if(index == MAX-1) 
    break; 

    cin.get(temp); 
    buffer [ index ] = temp; 
    index ++; 

} 
while (temp != '\n'); 

// add null char at the end. 
buffer[index] = '\0'; 

cout << buffer << endl; 

return 0; 
} 
1

幾個問題我注意到:

(1)什麼字符編碼輸入。您可能正在閱讀8,16或32位字符。你確定你正在讀ASCII嗎?(2)根據您的平臺,您正在搜索'\ n'行尾字符可能是'\ r \ n'或'\ r'或'\ n'。也許\角色本身就是你的方括號?

+2

缺少零字節存在主要問題在結束char序列的字符串中。這些筆記很有用,但現在它們並不重要 – Gaim 2010-01-10 19:57:57

0

您不在字符串末尾加'\ 0'。另外,你應該真的檢查緩衝區溢出情況。當索引達到1024時停止讀取。