Supongamos que tenemos un menú que presenta al usuario algunas opciones:comportamiento extraño cuando se lee en el int de STDIN
Welcome:
1) Do something
2) Do something else
3) Do something cool
4) Quit
El usuario puede presionar de 1 - 4 y luego la tecla enter. El programa realiza esta operación y luego presenta el menú al usuario. Una opción inválida solo debería mostrar el menú nuevamente.
que tienen la main()
método siguiente:
int main()
{
while (true)
switch (menu())
{
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
case 3:
doSomethingCool();
break;
case 4:
return 0;
default:
continue;
}
}
y la menu()
siguientes aparatos:
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;
}
Entrando tipos numéricos funciona muy bien. Ingresar 1 - 4 hace que el programa realice la acción deseada, y luego el menú se visualiza de nuevo. Si ingresa un número fuera de este rango, como -1 o 12, se mostrará nuevamente el menú como se esperaba.
Sin embargo, ingresar algo como 'q' simplemente hará que el menú se muestre una y otra vez infinitamente, sin siquiera detenerse para obtener la entrada del usuario.
No entiendo cómo podría estar sucediendo esto. Claramente, se está llamando a menu()
ya que el menú se muestra una y otra vez, sin embargo scanf()
es parte de menu()
, por lo que no entiendo cómo el programa entra en este estado de error donde no se solicita al usuario su entrada.
Originalmente tenía cin >> result
que hacía exactamente lo mismo.
Editar: No parece ser un related question, sin embargo el original source code ha desaparecido de Pastebin y uno de los enlaces respuestas a un article que, al parecer, una vez explicado por qué ocurre esto, pero ahora es un vínculo roto. ¿Tal vez alguien puede responder por qué sucede esto en lugar de vincular? :)
Editar: Usando this example, aquí es cómo he resuelto el problema:
int getNumericalInput()
{
string input = "";
int result;
while (true)
{
getline(cin, input);
stringstream sStr(input);
if (sStr >> result)
return result;
cout << "Invalid Input. Try again: ";
}
}
y simplemente sustituye
int result = 0;
scanf("%d", &result);
con
int result = getNumericalInput();
posible duplicado de [Una simple pregunta sobre cin] (http://stackoverflow.com/questions/5864540/a-simple-question-about-cin) –