2012-08-14 42 views
0

我想輸入一個字符串。當我輸入如John之類的東西時它工作正常。C++這是什麼問題while while循環

但是,如果我輸入類似John Smite的東西,我會陷入無限循環和終端崩潰。

string fullname; 

do{ 
    cout << "Please input the Full Name of the user: "; 
    cin >> fullname; 
}while(fullname==""); 
+0

對不起它不是一個for循環,錯字 – user1595932 2012-08-14 14:24:54

+0

什麼是「全名」? – PlasmaHH 2012-08-14 14:25:21

+0

全名是字符串 – user1595932 2012-08-14 14:27:43

回答

1

該空間正在扔錫。你應該使用getline。

+0

http://stackoverflow.com/a/2616977/62671 – 2012-08-14 14:28:36

+2

不,這不是空間。親自嘗試一下。給出的代碼片段(假設適當的包括等)對於輸入像「John Smite」(其中「fine」意味着它不會崩潰,當然不會將所有單詞放入fullname變量中)都可以正常工作。 – PlasmaHH 2012-08-14 14:34:10

+0

不應該因爲std :: cin在空格上標記化而使「John Smite」產生與「John」相同的結果? – Derek 2012-08-14 14:35:42

1

你可以試試這個:

do{ 
cout << "Please input the Full Name of the user: "; 
cin >> fullname; 
} 
while(fullname.length() == 0); 
+0

事實上你甚至不需要一個while循環,因爲cin一直等到輸入一個合適的值。但也許你可以使用while循環,如果你將檢查fullname是特殊的。 – 2012-08-14 14:34:28

+0

@MihribanMNAZ:這取決於你的意思是「適當的」。如果適當,你的意思是一個非空行,然後否。 cin會在用戶輸入時留下空的fullname,我猜測OP會通過要求非空名稱來防止這種情況。 – PlasmaHH 2012-08-14 14:35:56

+0

string :: length的返回值的類型爲'size_t',所以你的條件會比'(fullname.length()== 0)'更有意義。 – Derek 2012-08-14 14:38:55

0

至於爲什麼你得到一個無限循環 - operator>>過載std::string會先放棄任何前導空格,然後讀取多達無論是下一個空格或avaliable輸入結束。

當您輸入「John Smite」時,第一次迭代讀取「John」,第二次迭代讀取「Smite」,然後沒有更多輸入用於後續迭代。問題在於您的實現似乎在嘗試讀取之前清除fullname。但是因爲這個流不再處於良好狀態,所以沒有更多的讀取是可能的,並且存在你的無限循環。

你可以做這樣的事情,而不是:

string temp; 
string fullname; 
do { 
    cin.clear(); // clear any error flags 
    do { 
     if (cin >> temp) fullname += temp + ' '; 
    } while (cin.good()); 
} while (fullname.empty()); 

這有它縮短了多個相鄰的空格字符(好)的副作用,但它仍然是相當沉悶。

更好的方法是隻說

do std::getline(std::cin, fullname); while (fullname.empty());