[英]C++ cin.ignore and getline in while loop
我對編程很新,而且我在while循環中使用getline時遇到了麻煩。 當我輸出課程變量時,第一個字母丟失了。 擺脫cin.ignore將其發送到無限循環中。
這是我到目前為止所擁有的:
#include <iostream>
#include <string>
using namespace std;
int main (){
string answer = "Yes";
string course;
while (answer == "Yes"){
cin.ignore();
cout<< "Enter a course name: ";
getline (cin, course);
cout<< course << endl;
cout<< "Continue ('Yes' or 'No')? ";
cin>> answer;
cout<< answer << endl;
}
return 0;
}
將ignore
移動到循環的底部。 它可以刪除cin >>
運算符在緩沖區中留下的換行符,因此在使用cin >>
之后只需要它。
您還應該將ignore
參數傳遞給忽略所有內容,直到您輸入換行符,以防它們輸入的內容超過“是”或“否”。 你可以這樣做:
cin.ignore(numeric_limits<streamsize>::max(), '\n');
在這里查看一個工作示例: ideone 。
我看到的問題是,當您刪除cin.ignore()
時,您將獲得如下交互:
輸入課程名稱:數學
數學
繼續('是'還是'否')? 是
是
輸入課程名稱:
繼續('是'還是'否')? 是的//等等......
第二次它沒有提示你輸入課程。 這是因為用於提交信息的Enter / Return是由getline()
提取的, getline()
在它看到的第一個'\\ n'字符處停止。
修復它的一種方法是在自定義輸入后使用cin.ignore()。 請注意,如果從文件中讀取,則應該在課程輸入后結束行以獲得與此處相同的結果。
while (answer == "Yes"){
// REMOVE cin.ignore() FROM HERE
cout<< "Enter a course name: ";
getline (cin, course);
cout<< course << endl;
cout<< "Continue ('Yes' or 'No')? ";
cin>> answer;
cout<< answer << endl;
{ // THIS IS MORE EFFICIENT
cin.ignore(); // ADD cin.ignore() HERE TO DISCARD '\n'
}
{ // THIS WORKS BETTER FOR HUMAN INPUT
string dummy;
getline (cin, dummy)
}
}
如果你使用getline
,堅持使用getline
。 將它與流操作混合將很容易搞砸。
#include <iostream>
#include <string>
int main() {
std::string answer = "Yes";
std::string course;
while (answer == "Yes") {
do {
std::cout << "Enter a course name: ";
std::getline(std::cin, course);
} while (course == "");
std::cout << course << '\n';
do {
std::cout << "Continue ('Yes' or 'No')? ";
std::getline(std::cin, answer);
} while (answer != "Yes" && answer != "No");
std::cout << answer << '\n';
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.