Valider les entrées de l'utilisateur en C++
-
Utiliser les méthodes
cin
aveccin.clear
etcin.ignore
pour valider les entrées de l’utilisateur - Utiliser une fonction personnalisée pour valider l’entrée de l’utilisateur
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$
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