Convalida l'input dell'utente in C++
-
Usa i metodi
cin
concin.clear
ecin.ignore
per convalidare l’input dell’utente - Utilizzare la funzione definita personalizzata per convalidare l’input dell’utente
Questo articolo illustrerà più metodi su come convalidare l’input dell’utente in C++.
Usa i metodi cin
con cin.clear
e cin.ignore
per convalidare l’input dell’utente
Questo esempio si concentra su un solido metodo di convalida dell’input dell’utente, il che significa che dovrebbe soddisfare i requisiti di controllo degli errori di base e continuare l’esecuzione anche quando l’input è del tipo sbagliato.
Il primo costrutto per implementare questa caratteristica è il cicli while
e specificheremo true
in una condizione. Questa iterazione garantirà un comportamento ricorrente fino a quando il valore corretto non verrà memorizzato in una variabile. All’interno del bucle, un’istruzione if
valuta l’espressione cin >> var
perché il valore restituito è positivo su un’operazione di inserimento riuscita. Una volta che il valore è stato correttamente memorizzato, possiamo uscire dal bucle; altrimenti, se l’espressione cin
non ha avuto successo, l’esecuzione si sposta sulla chiamata cin.clear
, che disattiva il failbit dopo un input imprevisto. Successivamente, saltiamo i caratteri rimanenti nel buffer di input e andiamo all’iterazione successiva per chiedere all’utente.
#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;
}
Produzione:
Enter the age of the wine: 32
Utilizzare la funzione definita personalizzata per convalidare l’input dell’utente
Il metodo precedente potrebbe essere piuttosto macchinoso anche per diverse variabili di input, e lo spazio del codice verrebbe sprecato con più cicli while
. Pertanto, la subroutine dovrebbe essere generalizzata come funzione. validateInput
è il modello di funzione che accetta il riferimento della variabile e restituisce il valore memorizzato con successo.
Si noti che, anche se è necessario implementare un quiz di 100 domande, questo metodo garantisce un codice molto più pulito rispetto a quello della versione precedente.
#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;
}
Produzione:
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