Validar a Entrada do Utilizador em C++

Jinku Hu 12 outubro 2023
  1. Utilizar cin com cin.clear e cin.ignore Métodos para validar a entrada do utilizador
  2. Utilizar a Função Definida Personalizada para Validar a Entrada do Utilizador
Validar a Entrada do Utilizador em C++

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

Artigo relacionado - C++ IO