2012-02-28 83 views
1

我試圖從用戶讀取多個Stringsints。我想要使​​用Name和Age對,並繼續操作,直到用戶輸入「done」。但我的do-while在早期崩潰,我不明白爲什麼?雖然循環失敗,當讀取int和字符串時C++

int number; 
string name; 
do 
{ 
cout << "Your name: " ; 
getline(cin, name);  
cout <<name<< " age: " ; 
cin >> number; 
} 
while (name!="done"); 

編輯:同樣在進入「完成」後,我還必須在年齡上輸入「完成」,爲什麼?

+0

請告訴我,當它崩潰的輸入? – Rolle 2012-02-28 10:08:49

+0

我想知道這只是你在鍵入一些NaN值的時候詢問的年齡 – 2012-02-28 10:09:50

+0

我可以輸入兩個值一次,名字和年齡,但第二次,它打印我最後一次輸入100萬次.. – Handsken 2012-02-28 10:11:27

回答

2

我試圖在VS 2010中運行你的程序,甚至當我輸入一個有效的數字時,程序會讓我驚訝地跳過讀下一個名字。

在我看來,cin >> number不會吞下'\ n'我自然輸入數字後。

我試圖在每個cin >> number後面添加對getchar()的調用,並且該程序令人驚訝地按預期開始工作。

因此,結論是,即使輸入的數字是OK,或者求助於使用getline()(然後解析)讀取數字,您也應該在cin >> number之後清除()/ ignore()。

如果你不想輸入「完成」的年齡,那麼你必須在進入後立即跳出循環。我的最終代碼:

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    int number; 
    string name; 
    while(true) 
    { 
     cout << "Your name: " ; 
     getline(cin, name); 
     if(name == "done") 
      break; 
     cout <<name<< " age: " ; 
     cin >> number; 
     cin.clear(); 
     cin.ignore(std::numeric_limits<streamsize>::max(),'\n'); 
    } 
} 
+0

是的,謝謝!這確實解決了我的問題! :) – Handsken 2012-02-28 11:06:39

2

如果有人輸入了一個無效的年齡,即非數字的東西,則需要清除cin的標誌,並清除剩餘的字符。

if(!(cin >> number) 
{ 
    cin.clear(); 
} 
cin.ignore(std::numeric_limits<streamsize>::max()); 

如果它確實讀取了一個數字,那麼您還需要忽略後面的換行符。

+0

這給了我一個空格,輸入一個數字後,我必須再輸入一個才能讓程序循環? – Handsken 2012-02-28 10:23:48

+1

cin從來不是我的強項。在實際的代碼中,我從不使用它。當你輸入數字時,它會以換行符結束,並且我懷疑它是否保留在下一個getline調用的緩衝區中,所以即使在讀取成功之後,也可能需要跳過它(用另一個忽略)。 – CashCow 2012-02-28 10:48:04

0

因爲你給它一個同時期待一個INTage

在第一次迭代結束後,爲您鍵入的輸入鍵輸入age,額外換行符被帶到cin。因此在第二次迭代中,換行顯示爲空行,導致name被設置爲空字符串。然後該程序想要int作爲age。如果你不夠小心,你會輸入一個字符串並導致程序崩潰。

一個建議: 要更換:

getline(cin, name); 

有:

do { 
    getline(cin, name);  
} while (name.empty()); 
1
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string name; 
    int age; 
    while (true) 
    { 
     std::cout << "Please enter your name: "; 
     std::cin >> name; 
     if ("done" == name) 
      break; 
     std::cout << name << ", please enter your age: "; 
     std::cin >> age; 
     std::cout << name << ", you are " << age << " years old\n"; 
    } 
    std::cout << "Bye.\n"; 
    return 0; 
} 

混合使用getline()>>可能會有問題。如果可以,最好避免它。您也可以使用getline(),並使用stringstream或可能的atoi()轉換int,但我不太喜歡那麼多。

1

使用空間std

這樣

int number; 
string name; 
do 
{ 
std::cout<<"Your name: " ; 
std::cin>>name;  
std::cout<<name<<" age: " ; 
std::cin>>number; 
} 
while (name!="done"); 

或者這

using namspace std; 
int number; 
    string name; 
    do 
    { 
    std::cout<<"Your name: " ; 
    std::cin>>name;  
    std::cout<<name<<" age: " ; 
    std::cin>>number; 
    } 
    while (name!="done");