En el siguiente ciclo, si escribimos caracteres como cin
entrada en lugar de los números que se esperan, entonces entra en un ciclo infinito. ¿Alguien podría explicarme por qué ocurre esto?
Cuando usamos cin
, si la entrada no es un número, ¿hay formas de detectarlo para evitar los problemas mencionados anteriormente?
unsigned long ul_x1, ul_x2;
while (1)
{
cin >> ul_x1 >> ul_x2;
cout << "ux_x1 is " << ul_x1 << endl << "ul_x2 is " << ul_x2 << endl;
}
Solución del problema
Bueno, siempre tendrás un ciclo infinito, pero sé que lo que realmente quieres saber es por qué cin no sigue solicitando una entrada en cada iteración del ciclo, lo que hace que tu ciclo infinito se ejecute libremente.
La razón es porque cin falla en la situación que describe y no leerá más entradas en esas variables. Al dar una entrada incorrecta a cin, cin entra en el estado de falla y deja de solicitar la entrada de la línea de comando, lo que hace que el bucle se ejecute libremente.
Para una validación simple, puede intentar usar cin para validar sus entradas verificando si cin está en estado de falla. Cuando ocurre una falla, borre el estado de falla y obligue a la transmisión a desechar la entrada incorrecta. Esto devuelve cin a la operación normal para que pueda solicitar más información.
if (cin.fail())
{
cout << "ERROR -- You did not enter an integer";
// get rid of failure state
cin.clear();
// From Eric's answer (thanks Eric)
// discard 'bad' character(s)
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Para una validación más sofisticada, es posible que desee leer primero una cadena y realizar verificaciones más sofisticadas en la cadena para asegurarse de que coincida con lo que espera.
No hay comentarios.:
Publicar un comentario