Validar la entrada del usuario en C++
-
Usar
cin
con los métodoscin.clear
ycin.ignore
para validar la entrada del usuario - Usar la función definida por el usuario para validar la entrada del usuario
Este artículo demostrará múltiples métodos sobre cómo validar la entrada del usuario en C++.
Usar cin
con los métodos cin.clear
y cin.ignore
para validar la entrada del usuario
Este ejemplo se centra en un método robusto de validación de entradas del usuario, lo que significa que debe satisfacer los requisitos básicos de comprobación de errores y seguir ejecutándose incluso cuando la entrada es del tipo equivocado.
El primer constructo para implementar esta característica es el bucle while
, y vamos a especificar true
en una condición. Esta iteración garantizará un comportamiento recurrente hasta que el valor correcto sea almacenado en una variable. Dentro del bucle, una sentencia if
evalúa la expresión cin >> var
porque el valor de retorno es positivo en una operación de inserción exitosa. Una vez que el valor es almacenado correctamente, podemos salir del bucle; de lo contrario, si la expresión cin
no tuvo éxito, la ejecución pasa a la llamada cin.clear
, que desestabiliza el failbit después de una entrada inesperada. A continuación, saltamos a través de los caracteres sobrantes en el buffer de entrada y pasamos a la siguiente iteración para preguntar al usuario.
#include <iostream>
#include <limits>
#include <sstream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;
using std::string;
using std::vector;
int main() {
int age;
while (true) {
cout << "Enter the age of the wine: ";
if (cin >> age) {
break;
} else {
cout << "Enter a valid integer value!\n";
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
}
}
return EXIT_SUCCESS;
}
Producción :
Enter the age of the wine: 32
Usar la función definida por el usuario para validar la entrada del usuario
El método anterior podría ser bastante engorroso incluso para varias variables de entrada, y el espacio de código se desperdiciaría con múltiples bucles de while
. Por lo tanto, la subrutina debería ser generalizada como una función. validateInput
es la plantilla de funciones que toma la referencia de la variable y devuelve el valor almacenado con éxito.
Note que, incluso si necesitamos implementar un cuestionario de 100 preguntas, este método garantiza un código mucho más limpio de lo que la versión anterior produciría.
#include <iostream>
#include <limits>
#include <sstream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;
using std::string;
using std::vector;
template <typename T>
T &validateInput(T &val) {
while (true) {
cout << "Enter the age of the wine: ";
if (cin >> val) {
break;
} else {
cout << "Enter a valid integer value!\n";
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
}
}
return val;
}
int main() {
int age;
int volume;
int price;
age = validateInput(age);
volume = validateInput(volume);
price = validateInput(price);
cout << "\nYour order's in!\n"
<< age << " years old Cabernet"
<< " in " << volume << "ml bottle\nPrice: " << price << "$\n";
return EXIT_SUCCESS;
}
Producción :
Enter the age of the wine: 13
Enter the volume of the wine in milliliters: 450
Enter the price of the bottle: 149
Your order's in!
13 years old Cabernet in 450ml bottle
Price: 149$
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook