Convalida l'input dell'utente in C++

Jinku Hu 12 ottobre 2023
  1. Usa i metodi cin con cin.clear e cin.ignore per convalidare l’input dell’utente
  2. Utilizzare la funzione definita personalizzata per convalidare l’input dell’utente
Convalida l'input dell'utente in C++

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

Articolo correlato - C++ IO