Я написал оператор 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;
}
}
После того, как вы пытаетесь прочитать, и это не удается, поток помечается как находящийся в потерпеть поражение состояние, и все последующие попытки чтения будут терпеть неудачу автоматически, пока вы не очистите флаг сбоя, который сделан с clear()
функция.
Вы должны проверить состояние потока после каждый читал:
if (cin >> var) {
// do something sensible
} else {
cin.clear();
}
В противном случае значение хранится в var
после последнего успешного чтения будет считаться текущий вход для вашего алгоритма.
Других решений пока нет …