我对编程很新,而且我在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;
}
答案 0 :(得分:4)
将ignore
移动到循环的底部。它可以删除cin >>
运算符在缓冲区中留下的换行符,因此只有在使用cin >>
后才需要它。
您还应该将参数传递给ignore
以忽略所有内容,直到您输入换行符,以防他们输入的内容不仅仅是“是”或“否”。你可以用:
cin.ignore(numeric_limits<streamsize>::max(), '\n');
请在此处查看工作示例:ideone。
答案 1 :(得分:2)
我看到的问题是当你删除cin.ignore()
后,你会得到以下互动:
输入课程名称:数学
数学
继续('是'或'否')?是的
是
输入课程名称:
继续('是'或'否')?是的//等等......
第二次它没有提示你输入课程。
这是因为您用来提交信息的输入/返回是由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)
}
}
答案 2 :(得分:2)
如果您使用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';
}
}