Validar a Entrada do Utilizador em C++
-
Utilizar
cin
comcin.clear
ecin.ignore
Métodos para validar a entrada do utilizador - Utilizar a Função Definida Personalizada para Validar a Entrada do Utilizador
Este artigo irá demonstrar múltiplos métodos sobre como validar a entrada de dados do utilizador em C++.
Utilizar cin
com cin.clear
e cin.ignore
Métodos para validar a entrada do utilizador
Este exemplo centra-se num método robusto de validação de entrada de dados do utilizador, o que significa que deve satisfazer os requisitos básicos de verificação de erros e continuar a executar mesmo quando a entrada é do tipo errado.
A primeira construção para implementar esta característica é o while
, e vamos especificar o true
em condição. Esta iteração irá garantir um comportamento recorrente até que o valor correcto seja armazenado numa variável. Dentro do laço, uma declaração if
avalia a expressão cin >> var
porque o valor de retorno é positivo numa operação de inserção bem sucedida. Uma vez o valor correctamente armazenado, podemos sair do laço; caso contrário, se a expressão cin
não for bem sucedida, a execução passa para a chamada cin.clear
, o que anula o failbit após uma entrada inesperada. A seguir, saltamos os caracteres restantes no buffer de entrada e passamos à iteração seguinte para perguntar ao utilizador.
#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;
}
Resultado:
Enter the age of the wine: 32
Utilizar a Função Definida Personalizada para Validar a Entrada do Utilizador
O método anterior poderia ser bastante complicado até mesmo para várias variáveis de entrada, e o espaço de código seria desperdiçado com múltiplos while
loops. Assim, a sub-rotina deveria ser generalizada como uma função. O validateInput
é o modelo de função que toma a referência da variável e devolve o valor armazenado com sucesso.
Note que, mesmo que precisemos de implementar um questionário de 100 perguntas, este método garante um código muito mais limpo do que a versão anterior produziria.
#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;
}
Resultado:
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