Validar la entrada del usuario en C++

Jinku Hu 12 octubre 2023
  1. Usar cin con los métodos cin.clear y cin.ignore para validar la entrada del usuario
  2. Usar la función definida por el usuario para validar la entrada del usuario
Validar la entrada del usuario en C++

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$
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ IO