Предположим, у нас есть меню, которое предоставляет пользователю некоторые опции:
Welcome:
1) Do something
2) Do something else
3) Do something cool
4) Quit
Пользователь может нажать 1 - 4, а затем клавишу ввода.Программа выполняет эту операцию, а затем представляет меню обратно пользователю.Недопустимый параметр должен просто снова отобразить меню.
У меня есть следующий метод main()
:
int main()
{
while (true)
switch (menu())
{
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
case 3:
doSomethingCool();
break;
case 4:
return 0;
default:
continue;
}
}
и следующий menu()
:
int menu()
{
cout << "Welcome:" << endl
<< "1: Do something" << endl
<< "2: Do something else" << endl
<< "3: Do something cool" << endl
<< "4: Quit" << endl;
int result = 0;
scanf("%d", &result);
return result;
}
Ввод числовых типов прекрасно работает.Ввод 1 - 4 заставляет программу выполнить желаемое действие, после чего снова отображается меню.Ввод числа вне этого диапазона, такого как -1 или 12., снова отобразит меню, как и ожидалось.
Однако, введя что-то вроде 'q', вы просто будете бесконечно отображать меню снова и снова, даже не останавливаясьчтобы получить пользовательский ввод.
Я не понимаю, как это могло произойти.Ясно, что menu()
вызывается, так как меню отображается снова и снова, однако scanf()
является частью menu()
, поэтому я не понимаю, как программа попадает в это состояние ошибки, когда пользователю не предлагаетсяих ввод.
Первоначально у меня был cin >> result
, который сделал то же самое.
Редактировать: Похоже, связанный вопрос ,однако исходный исходный код исчез из pastebin, и один из ответов ссылается на статью , которая, очевидно, когда-то объясняла, почему это происходит, но теперь является мертвой ссылкой.Может быть, кто-то может ответить, почему это происходит, а не ссылки?:)
Редактировать: Используя этот пример , вот как я решил проблему:
int getNumericalInput()
{
string input = "";
int result;
while (true)
{
getline(cin, input);
stringstream sStr(input);
if (sStr >> result)
return result;
cout << "Invalid Input. Try again: ";
}
}
и я просто заменил
int result = 0;
scanf("%d", &result);
с
int result = getNumericalInput();