En C++, ¿cómo maneja las entradas incorrectas? Por ejemplo, si el programa solicita un número entero, cuando escriba un carácter debería poder hacer algo y luego repetir para hacer la entrada, pero el ciclo se vuelve infinito cuando ingresa un carácter cuando se necesita un número entero y viceversa.Cómo manejar una entrada de tipo de datos incorrecta
Respuesta
El motivo por el cual el programa entra en un bucle infinito es porque el indicador de entrada incorrecta de std::cin
se establece debido a la falla de la entrada. Lo que hay que hacer es borrar esa bandera y descartar la entrada incorrecta del buffer de entrada.
//executes loop if the input fails (e.g., no characters were read)
while (std::cout << "Enter a number" && !(std::cin >> num)) {
std::cin.clear(); //clear bad input flag
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard input
std::cout << "Invalid input; please re-enter.\n";
}
Ver the C++ FAQ para este y otros ejemplos, incluyendo la adición de un mínimo y/o máximo en la condición.
Otra forma sería obtener la entrada como una cadena y convertirla a un número entero con std::stoi
o algún otro método que permita verificar la conversión.
Pruebe la entrada para ver si es o no lo que espera su programa. Si no es así, advierta al usuario que la entrada que proporcionaron es inaceptable.
Puede verificarlo a través del valor ASCII si el valor de ascii es entre 65 t0 90 o 97 a 122 el carácter.
La respuesta más votado abarca la solución realmente bien.
Además de esa respuesta, esto puede ayudar a visualizar lo que está pasando un poco mejor:
int main()
int input = 1;//set to 1 for illustrative purposes
bool cinState = false;
string test = "\0";
while(input != -1){//enter -1 to exit
cout << "Please input (a) character(s): ";//input a character here as a test
cin >> input; //attempting to input a character to an int variable will cause cin to fail
cout << "input: " << input << endl;//input has changed from 1 to 0
cinState = cin;//cin is in bad state, returns false
cout << "cinState: " << cinState << endl;
cin.clear();//bad state flag cleared
cinState = cin;//cin now returns true and will input to a variable
cout << "cinState: " << cinState << endl;
cout << "Please enter character(s): ";
cin >> test;//remaining text in buffer is dumped here. cin will not pause if there is any text left in the buffer.
cout << "test: " << test << endl;
}
return 0;
}
Dumping el texto en el búfer a una variable no es particularmente útil, sin embargo, ayuda a visualizar qué cin.ignore()
es necesario.
Noté también el cambio en la variable de entrada porque si está utilizando una variable de entrada en su condición para un bucle while
, o una declaración de interruptor puede entrar en un punto muerto, o puede cumplir una condición de que no t expecting, que puede ser más confuso de depurar.
- 1. calendario de primos: entrada de fecha incorrecta
- 2. Python & SCons & Matlab: entrada de comando incorrecta
- 3. Cómo deshabilitar un tipo de entrada = texto?
- 4. Manejar la entrada de usuario con Raphael
- 5. Convierta el valor de varchar a int sin lanzar una excepción en caso de entrada incorrecta
- 6. ¿Qué tipo de datos es adecuado para manejar datos binarios en el método ActiveX?
- 7. Cómo manejar el evento onchange en el tipo de entrada = archivo en jQuery?
- 8. .NET ParameterizedThreadStart tipo de devolución incorrecta
- 9. C++, cómo verificar es la entrada de datos es del tipo de datos correcto
- 10. ¿Puede un ASP.NET HttpHandler manejar un http 400 - Solicitud incorrecta?
- 11. ancho del 100% en el tipo de entrada enviar frente al texto del tipo de entrada
- 12. Biblioteca/estructura de datos para manejar datos enormes
- 13. cómo manejar valores nulos para el tipo de datos SQLDecimal en clases de FileHelper
- 14. Cómo cambiar el tipo de datos de una columna de datos en una tabla de datos?
- 15. Tipo de entrada WPF/cuadro de diálogo?
- 16. tipo de entrada - botón Atrás?
- 17. Manejar tipo de excepción específica en python
- 18. Puede MySQL Cluster manejar una base de datos de terabytes
- 19. ¿Cómo puedo cambiar el tipo de datos de un valor de entrada HTML a entero?
- 20. Datos principales: Cómo diseñar una estructura de datos de árbol a partir de una entrada de datos central
- 21. ¿Archivo de tipo de entrada de estilo?
- 22. Formtastic, propio: como tipo de entrada
- 23. Obtener todo el tipo de entrada contraseña
- 24. Cómo deshabilitar la corrección de corrección gramatical en los campos de texto de tipo de entrada
- 25. tipo de entrada de cambio de jQuery
- 26. Cómo determinar el tipo de datos de una variable
- 27. ¿Cómo obtener el tipo de datos de una variable uniforme
- 28. Tipo de entrada de Google Chrome = "fecha"
- 29. Cómo deshacer los cambios en la vista de cuadrícula en caso de entrada incorrecta
- 30. Cómo manejar el purgado de bases de datos en Mongodb
he hecho algunas investigaciones antes de preguntar aquí. Vi que pusieron cin.ignore (1000, '\ n'); que hace esto? ¡También! (Cin >> num) devuelve un booleano? No sabía que – Zik
gracias por el sitio – Zik
@Marvin, 'cin.ignore (1000, '\ n')' ignora/descarta caracteres en el búfer de entrada hasta que 1000 hayan sido descartados, o que se haya encontrado una nueva línea, lo que sea que venga primero. Es una buena manera de deshacerse de una línea. Verá en el ejemplo del parashift, usan el tamaño máximo de una secuencia en lugar de 1000 para representar una línea de longitud máxima. Yo uso 'cin.sync()' porque al hacer esto, quiero estar en igualdad de condiciones con el usuario (no leer la próxima línea todavía), así que lo descarto todo. Finalmente, 'cin' tiene un' operator void * ', por lo que no puede convertirse en un bool. – chris