我试图限制用户只输入“1”或“2”。
int ch;
do
{
cout<<"Enter: \n";
cin>>ch;
switch(ch)
{
case 1:
cout<<"1";
break;
case 2:
cout<<"2";
break;
default:
cout<<"Retry\n";
}
}while(ch != 1 && ch != 2);
当我输入1或2以外的任何数字时,程序会通过要求用户重试来运行,但是当我输入一个字符时,程序会进入“重试”和“输入”的无限循环。
答案 0 :(得分:3)
那是因为当你输入一个非数字字符时,输入操作符不能将其解析为整数,并将字符留在缓冲区中。因此循环的下一次迭代它再次读取完全相同的字符。一次又一次等等。
解决此问题的最简单方法是简单地将流提交到ignore其余部分:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input
还有其他方法,比如将整行读入字符串,将该字符串放入输入字符串流,然后从该流中读取整数。还有一点工作。这种方式确实意味着您不必检查std::cin
上的输入失败,但必须使用上述方法。
您完成的代码可能类似于
int n;
do
{
if (!std::cin >> n)
{
std::cout << "Only numbers accepted. Please try again.\n";
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Skip bad input
std::cin.clear(); // Clear error flags
}
// switch ...
} while (...);