我正在编写一个程序,我从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找到了相关信息。 ,但我不明白如何使用它们来解决我的问题。
答案 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;
}