【问题标题】:Why does cin.clear() fix an infinite loop caused by bad input to cin?为什么 cin.clear() 会修复因 cin 输入错误导致的无限循环?
【发布时间】:2012-12-05 01:54:11
【问题描述】:

我写了一个 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;
    }
}

【问题讨论】:

    标签: c++ infinite-loop cin


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢先生。此外,“做一些明智的事情”让我发笑。
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 2013-06-17
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多