我想輸入一個字符串。當我輸入如John
之類的東西時它工作正常。C++這是什麼問題while while循環
但是,如果我輸入類似John Smite
的東西,我會陷入無限循環和終端崩潰。
string fullname;
do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}while(fullname=="");
我想輸入一個字符串。當我輸入如John
之類的東西時它工作正常。C++這是什麼問題while while循環
但是,如果我輸入類似John Smite
的東西,我會陷入無限循環和終端崩潰。
string fullname;
do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}while(fullname=="");
該空間正在扔錫。你應該使用getline。
你可以試試這個:
do{
cout << "Please input the Full Name of the user: ";
cin >> fullname;
}
while(fullname.length() == 0);
事實上你甚至不需要一個while循環,因爲cin一直等到輸入一個合適的值。但也許你可以使用while循環,如果你將檢查fullname是特殊的。 – 2012-08-14 14:34:28
@MihribanMNAZ:這取決於你的意思是「適當的」。如果適當,你的意思是一個非空行,然後否。 cin會在用戶輸入時留下空的fullname,我猜測OP會通過要求非空名稱來防止這種情況。 – PlasmaHH 2012-08-14 14:35:56
string :: length的返回值的類型爲'size_t',所以你的條件會比'(fullname.length()== 0)'更有意義。 – Derek 2012-08-14 14:38:55
至於爲什麼你得到一個無限循環 - 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());
對不起它不是一個for循環,錯字 – user1595932 2012-08-14 14:24:54
什麼是「全名」? – PlasmaHH 2012-08-14 14:25:21
全名是字符串 – user1595932 2012-08-14 14:27:43