1

可能重复:
如何验证数字输入 C++

您如何执行以下操作:

while (iNumberOfPlayers <2 || iNumberOfPlayers >5)
{
    cout << "Enter number of players (1-4): ";
    cin >> iNumberOfPlayers;
    cin.clear();
    std::string s;
    cin >> s;
}

在查看了我被抛出的循环之后,只要我在循环中,它看起来cin就不会被重置(如果我输入 x)cin再次读取 X。while猜测这是一个缓冲区问题,有什么办法可以清除它?

然后我尝试了:

while (iNumberOfPlayers <2 || iNumberOfPlayers >5)
{
    cout << "Enter number of players (1-4): ";
    cin >> iNumberOfPlayers;
    cin.clear();
    cin.ignore();
}

除了一次读取所有内容1之外,它有效。如果我输入“xyz”,那么循环会经过 3 次,然后再停止询问。

4

2 回答 2

7

如果输入无效,则在流上设置失败位。流上使用的!运算符读取失败位(您也可以使用(cin >> a).fail()or (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";
}

请注意,如果您从非交互式输入读取,这将成为一个无限循环。因此,对已注释的错误检测代码使用一些变体。

于 2012-07-14T14:54:44.017 回答
3

棘手的是您需要消耗任何无效输入,因为读取失败不会消耗输入。最简单的解决方案是将调用移动operator >>到循环条件中,然后读取到\nif it didn't mange to read an 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');
  }
}
于 2012-07-14T15:01:17.050 回答