2010-10-08 105 views
0

來自澳大利亞投票問題:如何知道何時完成一個輸入cin n? (循環)

機器人將繼續放置信息,它可以達到1000行。什麼,他會進入 例子:

"1 2 3 
2 1 3 
2 3 1 
1 2 3 
3 1 2 
" 

我怎麼知道他什麼時候完成進入信息?最後還有一個\ n,這是我唯一的猜測。 cin似乎沒有檢測到\ n,但是getchar()顯然沒有。然而,即使在第一線課程之後,它也會得到\ n,並且使其運作變得相當困難。我該如何做到這一點?

回答

3
std::string line; 
while(std::getline(std::cin,line) && !line.empty()) { 
    std::istringstream iss(line); 
    int i1, i2, i3; 
    iss >> i1 >> i2 >> i3 
    if(!is) throw "dammit!" 
    process_numbers(i1,i2,i3); 
} 
if(!std::cin.good() && !std::cin.eof()) throw "dammit!"; 
+0

+1將他放在正確的軌道上,儘管如果循環終止處理了可選空白行,我會感到更安全。 – 2010-10-08 07:10:03

+0

謝謝你的例子,讓我走了一次我想我必須有cin.ignore更早的代碼lol – Russell 2010-10-08 07:41:51

+0

@Tony:我不知道你在幹什麼。我認爲空行會終止輸入? – sbi 2010-10-08 07:48:49

1

使用cin讀取輸入並且提取運算符>>跳過空白。相反,逐行讀取輸入,並在該行爲空時退出。

0

您可以改爲每次讀取一行,然後查找空白行(然後稍後將每個非空行分割爲其3個數字)。

6

我建議使用cin.getline它會得到一次一整行(用\ n結束),當你得到一個空行,你知道你就大功告成了。

編輯 作爲建議的履行機構,性病::函數getline通常是針對這種情況一個更好的選擇,因爲它利用了string真是讓人不是字符數組。

+1

我不同意這一點。 'std :: istream :: getline()'適用於原始的'char'數組 - 不是我推薦給新手的東西。自由函數'std :: getline()',自動擴展它寫入的字符串,對此更好。 – sbi 2010-10-18 08:26:33

+0

@sbi:感謝您的建議;我已經修改了包含它的答案。 – JoshD 2010-10-18 19:17:43

相關問題