Datenvalidierung in C++: Bibliotheken und Methoden (libvalidate, nlohmann/json, Boost)

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Datenvalidierung in C++: Überblick über Bibliotheken und praktische Ansätze



Datenvalidierung ist einer der Schlüsselaspekte bei der Entwicklung zuverlässiger Software in C++. Eine korrekte Überprüfung der Eingabedaten hilft, Laufzeitfehler, Sicherheitslücken und undefiniertes Verhalten zu vermeiden. Im Gegensatz zu Sprachen mit dynamischer Typisierung erfordert C++ eine explizite Kontrolle von Typen und Formaten durch den Entwickler. In diesem Artikel betrachten wir sowohl manuelle Methoden als auch spezialisierte Bibliotheken, die die Validierung vereinfachen.



1. Manuelle Validierung: Grundlegende Techniken



Der einfachste Weg ist die Überprüfung von Daten mit Hilfe von Bedingungsanweisungen. Dieser Ansatz eignet sich für kleine Projekte, wird aber schnell unübersichtlich.



#include <iostream>#include <string>#include <cctype>

bool validateEmail(const std::string& email) { if (email.empty()) return false; size_t atPos = email.find('@'); if (atPos == std::string::npos || atPos == 0) return false; size_t dotPos = email.rfind('.'); if (dotPos == std::string::npos || dotPos <= atPos + 1) return false; if (dotPos == email.length() - 1) return false; return true;}

int main() { std::string testEmail = "user@example.com"; std::cout << (validateEmail(testEmail) ? "Valid" : "Invalid") << std::endl; return 0;}


Nachteile: Schwierige Wartbarkeit, Code-Duplizierung, fehlende einheitliche Schnittstelle.



2. Die Bibliothek libvalidate



libvalidate ist eine leichtgewichtige Bibliothek für deklarative Datenvalidierung in C++17 und höher. Sie ermöglicht die Beschreibung von Prüfregeln in einem verkettbaren Stil, der an Validatoren in PHP oder Python erinnert.



Installation

Die Bibliothek wird als header-only vertrieben. Es reicht aus, validate.hpp in das Projekt zu kopieren oder über CMake einzubinden:

// Beispiel FetchContentinclude(FetchContent)FetchContent_Declare(libvalidate    GIT_REPOSITORY https://github.com/username/libvalidate.git    GIT_TAG v1.0.0)FetchContent_MakeAvailable(libvalidate)


Anwendungsbeispiel

#include "validate.hpp"#include <iostream>#include <string>

int main() { using namespace validate;

// Validierung einer Zahl (Alter) int age = 25; auto ageResult = check(age) .min(18, "Das Alter muss mindestens 18 Jahre betragen") .max(120, "Das Alter darf höchstens 120 Jahre betragen");

if (!ageResult.valid()) { std::cerr << ageResult.error() << std::endl; }

// Validierung eines Strings (Passwort) std::string password = "P@ssw0rd"; auto passResult = check(password) .minLength(8, "Das Passwort muss mindestens 8 Zeichen enthalten") .matches(R"((?=.*[A-Z])(?=.*[a-z])(?=.*\\d).*)", "Das Passwort muss Großbuchstaben, Kleinbuchstaben und Ziffern enthalten");

if (!passResult.valid()) { std::cerr << passResult.error() << std::endl; }

// Kombinierte Objektvalidierung struct User { std::string name; int age; std::string email; };

User user{"Alice", 30, "alice@example.com"}; auto userResult = check(user) .field(&User::name, "name") .minLength(2) .maxLength(50) .field(&User::age, "age") .range(18, 100) .field(&User::email, "email") .email(); // integrierte E-Mail-Überprüfung

if (!userResult.valid()) { for (const auto& err : userResult.errors()) { std::cerr << err.field << ": " << err.message << std::endl; } }

return 0;}


Besonderheiten:

  • Unterstützung integrierter Regeln: min, max, range, email, regex, notEmpty.
  • Möglichkeit zur Erstell

Empfehlungen