Benutzereingaben in C++ validieren

Jinku Hu 12 Oktober 2023
  1. Verwendung von cin mit den Methoden cin.clear und cin.ignore zur Validierung von Benutzereingaben
  2. Benutzerdefinierte Funktion zur Validierung von Benutzereingaben verwenden
Benutzereingaben in C++ validieren

In diesem Artikel werden mehrere Methoden zur Validierung von Benutzereingaben in C++ vorgestellt.

Verwendung von cin mit den Methoden cin.clear und cin.ignore zur Validierung von Benutzereingaben

In diesem Beispiel geht es um eine robuste Methode zur Überprüfung von Benutzereingaben, d. h. sie sollte grundlegende Anforderungen an die Fehlerprüfung erfüllen und auch dann weiter ausgeführt werden, wenn die Eingabe vom falschen Typ ist.

Das erste Konstrukt zur Implementierung dieser Funktion ist die while-Schleife, und wir werden true in einer Bedingung angeben. Diese Iteration wird ein wiederkehrendes Verhalten garantieren, bis der richtige Wert in einer Variablen gespeichert ist. Innerhalb der Schleife wertet eine if-Anweisung den Ausdruck cin >> var aus, da der Rückgabewert bei einer erfolgreichen Einfügeoperation positiv ist. Wenn der Wert korrekt gespeichert ist, können wir die Schleife verlassen; andernfalls, wenn der cin-Ausdruck nicht erfolgreich war, geht die Ausführung weiter zum Aufruf cin.clear, der das Failbit nach unerwarteter Eingabe zurücksetzt. Als nächstes überspringen wir die übrig gebliebenen Zeichen im Eingabepuffer und gehen zur nächsten Iteration, um den Benutzer zu fragen.

#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;
}

Ausgabe:

Enter the age of the wine: 32

Benutzerdefinierte Funktion zur Validierung von Benutzereingaben verwenden

Die bisherige Methode könnte selbst bei mehreren Eingabevariablen recht umständlich sein, und der Codeplatz würde mit mehreren while-Schleifen verschwendet werden. Daher sollte die Subroutine als Funktion verallgemeinert werden. validateInput ist die Funktionsvorlage, die die Referenz der Variablen entgegennimmt und den erfolgreich gespeicherten Wert zurückgibt.

Beachten Sie, dass diese Methode, selbst wenn wir ein Quiz mit 100 Fragen implementieren müssen, einen weitaus saubereren Code garantiert, als die vorherige Version ergeben würde.

#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;
}

Ausgabe:

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

Verwandter Artikel - C++ IO