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

时间:2012-12-05 01:54:11

标签: c++ infinite-loop 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;
    }
}

1 个答案:

答案 0 :(得分:3)

尝试读取并失败后,流将被标记为处于 fail 状态,并且所有后续读取尝试将自动失败,直到您清除失败标志为止, clear()函数。

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

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

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