我写了一个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;
}
}
答案 0 :(得分:3)
尝试读取并失败后,流将被标记为处于 fail 状态,并且所有后续读取尝试将自动失败,直到您清除失败标志为止, clear()
函数。
您应该在每次阅读后检查流的状态:
if (cin >> var) {
// do something sensible
} else {
cin.clear();
}
否则,在上次成功读取后存储在var
中的值将被视为算法的当前输入。