输入字符时的无限循环

时间:2016-08-12 11:40:51

标签: c++ logic

我试图限制用户只输入“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以外的任何数字时,程序会通过要求用户重试来运行,但是当我输入一个字符时,程序会进入“重试”和“输入”的无限循环。

1 个答案:

答案 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 (...);