C++中的输入错误检查

Input Error Checking in c++

    int x; // intitialize x but don't immediately prompt for input. This makes the program more user friendly

    cout << "Enter a year to check if it's a leap year: " << endl;
    cin >> x;

    while (cin.fail()) // check for input error

    {
    cin.clear();
    cin.ignore();
    cout << "You entered an incorrect value. Try again" << endl;
    cin >> x;
    }

我无法理解失败状态在 C++ 中的工作原理。我想要发生的是,如果用户输入除数字之外的任何内容,它将清除缓冲区并提示进行另一个输入。我的代码似乎无法做到这一点。如果我输入类似 say, r4 的内容,那么我的其余代码(工作得很好,所以我没有在下面显示)将 运行 与四个。似乎循环在某个时候被激活了。 cout 字符串仍然被打印出来。只是它没有给我机会重新输入并继续检查。

cin.good()cin.fail() 将让您知道它是否可以处理输入(有效。)cin.clear() 如果需要清除错误状态。

cin >> x;

cin 检查缓冲区中是否有任何内容。缓冲区是空的,所以它一直等到用户按下 return,然后将所有内容复制到它的缓冲区 (r4)。然后它尝试从缓冲区加载到 int。第一个字节是 r,因此它设置流的失败状态并中止。 r4 保留在缓冲区中。

cin.clear();

这会清除失败状态,r4 保留在缓冲区中。

cin.ignore();

这将忽略缓冲区中的第一个字符。 4 保留在缓冲区中。

cout << "You entered an incorrect value. Try again" << endl;
cin >> x;

cin 检查缓冲区中是否有任何内容, 并且有 (4),因此它尝试从缓冲区加载到 int,如您所见,它会成功并继续。

通常的解决方案是使用 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'),它会忽略该行的其余部分。

http://en.cppreference.com/w/cpp/io/basic_ios/fail获得的以下table显示了影响istream::fail()

的return值的各种状态

鉴于此,您应该使用:

while (cin.fail()) // check for input error
{
   if ( cin.eof() )
   {
      // Once EOF file has been reached with cin,
      // you can't do much. Figure out a way to bail
      // from the loop.
   }

   cin.clear();

   // Also, ignore not just one character but till the end of the line.
   // cin.ignore();
   cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

   cout << "You entered an incorrect value. Try again" << endl;
   cin >> x;
}