1

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

1 回答 1

2

一旦您尝试读取并且失败,则流被标记为处于失败状态,并且所有后续读取尝试将自动失败,直到您清除失败标志,这是使用clear()函数完成的。

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

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

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

于 2012-12-05T02:02:38.867 回答