c++ - try - Cómo manejar la entrada de tipo de datos incorrecto
try catch++ (4)
La respuesta más votada cubre la solución realmente bien.
Además de esa respuesta, esto puede ayudar a visualizar un poco mejor lo que sucede:
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;
}
Volcar el texto en el búfer a una variable no es particularmente útil, sin embargo, ayuda a visualizar por qué cin.ignore()
es necesario.
Noté el cambio en la variable de entrada también porque si está usando una variable de entrada en su condición para un bucle while, o una declaración de cambio, puede entrar en un punto muerto, o puede cumplir una condición que no esperaba, que Puede ser más confuso para depurar.
En C ++, ¿cómo manejas las entradas incorrectas? Al igual que, si el programa solicita un número entero, cuando escribe un carácter debería poder hacer algo y luego hacer un ciclo para repetir la entrada, pero el ciclo se vuelve infinito cuando ingresa un carácter cuando se necesita un número entero y viceversa.
Pruebe la entrada para ver si es o no lo que su programa espera. Si no lo está, avise al usuario que la entrada que proporcionó es inaceptable.
Puede verificarlo a través del valor ASCII si el valor ascii está entre 65 t0 90 o 97 a 122 si fuera el carácter.
La razón por la que el programa entra en un bucle infinito es porque el indicador de entrada incorrecto de std::cin
se establece debido a un error en la entrada. Lo que hay que hacer es borrar esa bandera y descartar la entrada incorrecta del búfer 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";
}
Consulte las Preguntas frecuentes de C ++ para esto y otros ejemplos, que incluyen agregar un mínimo y / o máximo a la condición.
Otra forma sería obtener la entrada como una cadena y convertirla en un entero con std::stoi
o algún otro método que permita verificar la conversión.