Cuando cin encuentra una entrada que no puede leer correctamente en la variable especificada (como ingresar un carácter en una variable entera), entra en un estado de error y deja la entrada en su búfer.
Tiene que hacer varias cosas para manejar adecuadamente este escenario.
- Tienes que comprobar este estado de error.
- Tienes que borrar el estado de error.
- Tiene que manejar alternativamente los datos de entrada que generaron el estado de error, o eliminarlos y volver a llamar al usuario.
El siguiente código proporciona uno de los numerosos métodos para hacer estas tres cosas.
#include<iostream>
#include<limits>
using namespace std;
int main()
{
cout << "Enter an int: ";
int x = 0;
while(!(cin >> x)){
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input. Try again: ";
}
cout << "You enterd: " << x << endl;
}
Se podía pasar en un valor grande para cin.ignore como 1000 y es probable que se comporten exactamente el mismo para todos los propósitos prácticos.
También puede probar cin después del intento de entrada y manejarlo de esa manera, algo así como if (! Cin) {// limpiar el error}.
Mira la referencia istream para otras funciones miembro para manejar estado de flujo: http://cplusplus.com/reference/iostream/istream/
¿Leer todo en una cadena y analizar la entrada en consecuencia? – Rhexis
Utilice cin.get() y luego verifique si hay caracteres EOF. – Ansari