如何执行以下操作:
while (iNumberOfPlayers <2 || iNumberOfPlayers >5)
{
cout << "Enter number of players (1-4): ";
cin >> iNumberOfPlayers;
cin.clear();
std::string s;
cin >> s;
}
看着我被抛入的循环后,看起来cin
没有被重置(如果我放入x)cin
只要我在while
循环。猜测这是一个缓冲问题,有什么方法可以清除它吗?
然后我尝试了:
while (iNumberOfPlayers <2 || iNumberOfPlayers >5)
{
cout << "Enter number of players (1-4): ";
cin >> iNumberOfPlayers;
cin.clear();
cin.ignore();
}
除了它一次读取所有内容之外,有效。如果我输入“xyz”,那么循环会经过3次,然后再停止再次询问。
答案 0 :(得分:7)
如果输入无效,则在流上设置失败位。流上使用的!
运算符会读取失败位(您也可以使用(cin >> a).fail()
或(cin >> a), cin.fail()
)。
然后你必须在再次尝试之前清除失败位。
while (!(cin >> a)) {
// if (cin.eof()) exit(EXIT_FAILURE);
cin.clear();
std::string dummy;
cin >> dummy; // throw away garbage.
cout << "entered value is not a number";
}
请注意,如果您正在阅读非交互式输入,这将成为一个无限循环。因此,在注释的错误检测代码上使用一些变体。
答案 1 :(得分:3)
棘手的是你需要消耗任何无效的输入,因为读取失败不会消耗输入。最简单的解决方案是将调用移至operator >>
进入循环条件,然后在\n
未读取int
的情况下读取#include <iostream>
#include <limits>
int main() {
int a;
while (!(std::cin >> a) || (a < 2 || a > 5)) {
std::cout << "Not an int, or wrong size, try again" << std::endl;
std::cin.clear(); // Reset error and retry
// Eat leftovers:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
:
{{1}}