如何正确使用c ++中的cin.fail()

时间:2015-10-22 15:12:57

标签: c++ iostream

我正在编写一个程序,我从cin>>iUserSel;用户那里得到一个整数输入。如果用户输入一个字母,程序将进入无限循环。我尝试使用下面的代码来防止这种情况,但程序进入无限循环并打印出来#34;错误!输入#!"。我该如何修复我的程序?

cin>>iUserSel;
while (iValid == 1)
{
        if (cin.fail())
        {
                cin.ignore();
                cout<<"Wrong! Enter a #!"<<endl;
                cin>>iUserSel;
        }//closes if
        else
                iValid = 0;
}//closes while

我在Correct way to use cin.fail()C++ cin.fail() question找到了相关信息。 ,但我不明白如何使用它们来解决我的问题。

3 个答案:

答案 0 :(得分:4)

cin失败后,您需要清除错误标志,否则任何其他输入操作都将是非操作。要清除错误标记,您需要调用cin.clear()。您的代码将成为

cin >> iUserSel;
while (iValid == 1)
{
    if (cin.fail())
    {
        cin.clear(); // clears error flags
        cin.ignore();
        cout << "Wrong! Enter a #!" << endl;
        cin >> iUserSel;
    }//closes if
    else
        iValid = 0;
}//closes while

我还建议您将cin.ignore();更改为cin.ignore(numeric_limits<streamsize>::max(), '\n');,以防用户输入超过1个字母。

答案 1 :(得分:4)

您遇到的问题是您没有清除流中的failbit。这是通过clear函数完成的。

在一个有点相关的说明中,你根本不需要使用fail函数,而是依赖于输入操作符函数返回流的事实,并且可以在{{ 3}},然后你可以做类似下面的(未经测试的)代码:

while (!(std::cin >> iUserSel))
{
    // Clear errors (like the failbit flag)
    std::cin.clear();

    // Throw away the rest of the line
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    std::cout << "Wrong input, please enter a number: ";
}

答案 2 :(得分:0)

以下是我的建议:

// Read the data and check whether read was successful.
// If read was successful, break out of the loop.
// Otherwise, enter the loop.
while ( !(cin >> iUserSel) )
{
   // If we have reached EOF, break of the loop or exit.
   if ( cin.eof() )
   {
      // exit(0); ????
      break;
   }

   // Clear the error state of the stream.
   cin.clear();

   // Ignore rest of the line.
   cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

   // Ask more fresh input.
   cout << "Wrong! Enter a #!" << endl;
}