输入字符时的无限循环

Infinite Loop when a character is entered

本文关键字:无限循环 字符 输入      更新时间:2023-10-16

我试图限制用户只能输入'1'或'2'。

int ch;
do
{
    cout<<"Enter: n";
    cin>>ch;
    switch(ch)
    {
    case 1:
        cout<<"1";
        break;
    case 2:
        cout<<"2";
        break;
    default:
        cout<<"Retryn";
    }
}while(ch != 1 && ch != 2);

当我输入除1或2以外的任何数字时,程序运行正常,要求用户重试,但是当我输入一个字符时,程序进入'重试'和'输入'的无限循环。

这是因为当您输入非数字字符时,输入操作符无法将其解析为整数,并且将该字符留在缓冲区中。所以下一次循环的迭代,它又读取了完全相同的字符。如此反复。

克服这个问题的最简单的方法是简单地要求流忽略该行的其余部分:

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";
        // Skip bad input
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
        std::cin.clear();  // Clear error flags
    }
    // switch ...
} while (...);