2014-11-05 74 views
0

在閱讀了許多有關getline被跳過的線程之後,我仍然無法讓我的程序正常工作。getline()在多次調用後跳過

首先我讀了用戶的輸入。它應該像「ADD 1」一樣。然後顯示「ADD」後的值。我開始再次閱讀用戶的輸入,並且由於某些原因,以下getline不想從'ss'讀取,並且將命令留空。

下面的代碼:

string lecture, command; 
getline(cin, lecture); 
stringstream ss(lecture); 
getline(ss, command, ' '); 
while(command.compare("EXIT") != 0) { 
    if(command.compare("ADD") == 0) { 
     string id; 
     getline(ss, id); 
     cout << id << endl; 
    } 
    lecture = ""; 
    command = ""; 
    getline(cin, lecture); 
    ss.str(lecture); 
    getline(ss, command, ' '); 
} 

和輸入/輸出(輸出用 「>」 來區分):

ADD 1 
>1 
ADD 2 
(From here -> Goes back to getline(cin, lecture)) 

我不明白我在做什麼錯? 循環中的第一個getline運行良好,但後來出錯。 很明顯,命令保持空白,即使在getline之後。但是我不明白爲什麼當getline(ss,command,'')作爲getline放棄'\ n'時,爲什麼會有'\ n'後綴,因此命令應該具有新值。

謝謝!

編輯: 有人評論說stringstream.str不正確或重置的東西,他是正確的(爲什麼你刪除你的答案?!)!我知道在每個循環中重新創建對象字符串流,並且它可以工作。如果有比重新創建對象更好的解決方案,我將保持打開的線程。

基本上現在ss是一個指針,而在環我做的每一次迭代:SS =新的字符串流(講座)

+0

我看看這個[主題](http://stackoverflow.com/questions/6378662/getline-problem),我不應該有同樣的問題我的程序中沒有使用任何cin >>,對吧? – 2014-11-05 22:03:24

+0

有人評論說stringstream.str沒有正確重設或什麼,他是對的(爲什麼你刪除了你的答案?!)!我知道在每個循環中重新創建對象字符串流,並且它可以工作。如果有比重新創建對象更好的解決方案,我將保持打開的線程。 – 2014-11-05 22:15:37

+1

'ss.clear()'應該重置stringstream上的任何錯誤。沒有理由一直新的。如果你需要清除任何剩餘的數據,'ss.str(「」);'會做到這一點。 – 2014-11-05 22:25:26

回答

1

我覺得你ss不包括endl是困惑。另一個奇怪的是,指令ss.str(lecture);對我的機器沒有影響。這可能是一個圖書館的錯誤?總之,我使用>>而不是getliness,因爲ss可以在流/出:

string lecture, command; 
getline(cin, lecture); 
stringstream ss; 
ss << lecture << endl; 
ss >> command; 

while(command.compare("EXIT") != 0) { 
    if(command.compare("ADD") == 0) { 
     string id; 
     ss >> id; 
     cout << id << endl; 
    } 
    lecture = ""; 
    command = ""; 
    getline(cin, lecture); 
    ss << lecture << endl; 
    ss >> command; 
} 

另外,使用getline(),我也使它工作,與限制,即鍵入「EXIT」將不會退出,您需要輸入「EXIT」,即在「EXIT」後面有空格,因爲它每次都在查找命令後的空格。 (來自您的程序的錯誤)。無論如何,這是getline()版本:

string lecture, command; 
getline(cin, lecture); 
stringstream ss(lecture + "\n"); 
getline(ss, command, ' '); 

while(command.compare("EXIT") != 0) { 
    if(command.compare("ADD") == 0) { 
     string id; 
     getline(ss, id); 
     cout << id << endl; 
    } 
    lecture = ""; 
    command = ""; 
    getline(cin, lecture); 
    ss.str(lecture + "\n"); 
    getline(ss, command, ' '); 
} 
+0

實際上,'ss'不是必需的。 'cin'本身就是一條小溪。因此,對於我的第一個解決方案,只需使用'cin >> command'和'cin >> id'來代替ss做什麼。 – 2014-11-07 02:59:36