在c ++中输入错误检查

时间:2015-02-20 17:47:04

标签: c++ input

    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字符串仍然打印出来。只是它没有给我机会重新输入和继续检查。

3 个答案:

答案 0 :(得分:2)

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

返回值的各种状态

enter image description here

鉴于此,您应该使用:

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;
}

答案 1 :(得分:0)

cin >> x;

cin检查缓冲区中是否有任何内容。缓冲区为空,因此它等待用户按下return,然后将所有内容复制到缓冲区(r4)。然后它尝试从缓冲区加载到int。第一个字节是r,因此它设置流的failstate并中止。 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'),忽略该行的其余部分。

答案 2 :(得分:-1)

cin.good()cin.fail()会告诉您是否可以处理输入(有效)。cin.clear()会在需要时清除错误状态。