c++ 为什么cin.clear()修复了由cin错误输入引起的无限循环?

我写了一个switch语句,并创建了一个默认值,只是说用户选择了一个错误选项并重复输入.我想确保如果有问题,它会首先清除缓冲区,所以我使用了cin.sync(),但输入’a’仍然导致无限循环.我添加了cin.clear()来清除那些给我工作代码的标志……但我的困惑是为什么它起作用.如果有失败标志,cin.sync()不起作用吗?

声明如下,为简洁而截断:

while(exitAllow == false)
{
    cout<<"Your options are:\n";
    cout<<"1: Display Inventory\n";
    /*truncated*/
    cout<<"5: Exit\n";
    cout<<"What would you like to do? ";

    cin.clear();   //HERE IS MY CONFUSION//
    cin.sync();
    cin>>action;
    switch(action)
    {
        case 1:
                    /*truncated*/
        case 5:
            exitAllow = true;
            break;
        default:
            cout<<"\ninvalid entry!\n";
            break;
    }
}
最佳答案
一旦您尝试读取并且失败,流将被标记为处于失败状态,并且所有后续读取尝试将自动失败,直到您清除失败标志,这是使用clear()函数完成的.

您应该在每次阅读后检查流的状态:

if (cin >> var) {
   // do something sensible
} else {
   cin.clear();
}

否则,在上次成功读取后存储在var中的值将被视为算法的当前输入.

转载注明原文:c++ 为什么cin.clear()修复了由cin错误输入引起的无限循环? - 代码日志