Valider les entrées de l'utilisateur en C++

Jinku Hu 12 octobre 2023
  1. Utiliser les méthodes cin avec cin.clear et cin.ignore pour valider les entrées de l’utilisateur
  2. Utiliser une fonction personnalisée pour valider l’entrée de l’utilisateur
Valider les entrées de l'utilisateur en C++

Cet article présente plusieurs méthodes de validation des données saisies par l’utilisateur en C++.

Utiliser les méthodes cin avec cin.clear et cin.ignore pour valider les entrées de l’utilisateur

Cet exemple porte sur une méthode robuste de validation des entrées par l’utilisateur, ce qui signifie qu’elle doit satisfaire aux exigences de base en matière de vérification des erreurs et continuer à s’exécuter même lorsque l’entrée est du mauvais type.

La première construction pour implémenter cette fonctionnalité est la boucle while, et nous allons spécifier true dans une condition. Cette itération garantira un comportement récurrent jusqu’à ce que la valeur correcte soit stockée dans une variable. À l’intérieur de la boucle, une instruction if évalue l’expression cin >> var parce que la valeur de retour est positive sur une opération d’insertion réussie. Une fois que la valeur est correctement stockée, on peut sortir de la boucle ; sinon, si l’expression cin n’a pas réussi, l’exécution se déplace sur l’appel cin.clear, qui désactive le failbit après une entrée inattendue. Ensuite, nous sautons les caractères restants dans le tampon d’entrée et passons à l’itération suivante pour demander à l’utilisateur.

#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;
}

Production :

Enter the age of the wine: 32

Utiliser une fonction personnalisée pour valider l’entrée de l’utilisateur

La méthode précédente pouvait être assez lourde, même pour plusieurs variables d’entrée, et l’espace de code serait gaspillé avec de multiples boucles d’attente. Ainsi, la sous-routine devrait être généralisée en tant que fonction. validateInput est le modèle de fonction qui prend la référence de la variable et renvoie la valeur stockée avec succès.

Notez que, même si nous devons implémenter un quiz de 100 questions, cette méthode garantit un code bien plus propre que ce que la version précédente aurait produit.

#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;
}

Production :

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$
Auteur: 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

Article connexe - C++ IO