检查int的C ++字符串:modified:clearing cin

时间:2012-07-14 14:43:40

标签: c++ string int cin

  

可能重复:
  How to validate numeric input 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只要我在while循环。猜测这是一个缓冲问题,有什么方法可以清除它吗?

然后我尝试了:

while (iNumberOfPlayers <2 || iNumberOfPlayers >5)
{
    cout << "Enter number of players (1-4): ";
    cin >> iNumberOfPlayers;
    cin.clear();
    cin.ignore();
}
除了它一次读取所有内容之外,

有效。如果我输入“xyz”,那么循环会经过3次,然后再停止再次询问。

2 个答案:

答案 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}}