为什么cin.clear()修复因错误输入到CIN无限循环?(Why does cin.clear(

2019-07-04 13:23发布

我写了一个switch语句,并创建一个默认这将简单地说,用户选择了一个错误的选项,并重复输入。 我想确保,如果存在这样的问题,那就先清除缓冲区,所以我用cin.sync(),但进入一个“一”为输入还是造成了一个无限循环。 我加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;
    }
}

Answer 1:

一旦你尝试阅读和失败,流标是在故障状态,以及所有后续尝试读取会自动失败,直到您清除失败标志,这与做clear()函数。

你应该检查每个读取的数据流的状态:

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

否则,存储在值var最后的成功读取后会被认为是你的算法的电流输入。



文章来源: Why does cin.clear() fix an infinite loop caused by bad input to cin?