Datenvalidierung in C++: Überblick über Bibliotheken und praktische Beispiele
In der modernen C++-Entwicklung ist die Datenvalidierung einer der wichtigsten Schritte bei der Verarbeitung von Benutzereingaben, Netzwerkanfragen oder Konfigurationsdateien. Ohne zuverlässige Prüfung wird die Anwendung anfällig für fehlerhafte Daten, was zu Abstürzen, Speicherlecks oder logischen Fehlern führen kann. In diesem Artikel betrachten wir die grundlegenden Ansätze und beliebten Bibliotheken zur Datenvalidierung in C++.
Warum ist Validierung notwendig?
Validierung löst drei Hauptaufgaben:
- Sicherheit — Verhinderung der Eingabe schädlicher Daten (SQL-Injection, Pufferüberlauf).
- Korrektheit — Garantie, dass die Daten dem erwarteten Format entsprechen (E-Mail, Telefonnummer, Alter).
- Stabilität — Ausschluss von Fehlern bei der Typkonvertierung (z. B. Zeichenkette in Zahl).
Bibliotheken für die Validierung in C++
Betrachten wir einige beliebte Lösungen, die in C++-Projekten verwendet werden können.
1. Boost.LexicalCast — einfache Zahlenprüfung
Die Bibliothek Boost.LexicalCast ermöglicht die sichere Umwandlung von Zeichenketten in Zahlen und umgekehrt. Bei einem Fehler wird eine Ausnahme boost::bad_lexical_cast ausgelöst.
#include <boost/lexical_cast.hpp>#include <iostream>#include <string>
bool isValidNumber(const std::string& input) { try { int value = boost::lexical_cast<int>(input); return (value >= 0 && value <= 100); } catch (const boost::bad_lexical_cast&) { return false; }}
int main() { std::cout << isValidNumber("50") << std::endl; // 1 std::cout << isValidNumber("abc") << std::endl; // 0 return 0;}2. PicoJSON — Validierung von JSON-Strukturen
Zur Überprüfung von JSON-Daten wird häufig die leichtgewichtige Bibliothek PicoJSON verwendet. Sie ermöglicht das Parsen von JSON und die Prüfung auf erforderliche Felder.
#include "picojson.h"#include <iostream>#include <string>
bool validateUserJSON(const std::string& jsonStr) { picojson::value val; std::string err = picojson::parse(val, jsonStr); if (!err.empty()) return false;
picojson::object& obj = val.get<picojson::object>(); // Prüfen auf Vorhandensein des Feldes "name" vom Typ string if (obj.count("name") == 0 || !obj["name"].is<std::string>()) return false; // Prüfen des Feldes "age" — muss eine Zahl sein und > 0 if (obj.count("age") == 0 || !obj["age"].is<double>()) return false; double age = obj["age"].get<double>(); if (age <= 0 || age > 150) return false; return true;}
int main() { std::string valid = R"({"name":"Alice","age":30})"; std::string invalid = R"({"name":"Bob","age":-5})"; std::cout << validateUserJSON(valid) << std::endl; // 1 std::cout << validateUserJSON(invalid) << std::endl; // 0 return 0;}3. Validator-Muster (eigene Implementierung)
Wenn eine flexible Validierungsregel benötigt wird, kann eine eigene Validator-Klasse implementiert werden. Beispiel für die Überprüfung einer E-Mail-Adresse:
#include <regex>#include <string>#include <iostream>
class EmailValidator {public: bool validate(const std::string& email) const { // Einfachster regulärer Ausdruck für E-Mail static const std::regex pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})"); return std::regex_match(email, pattern); }};
int main() { EmailValidator ev; std::cout << ev.validate("user@example.com") << std::endl; // 1 std::cout << ev.validate("invalid-email") << std::endl; // 0 return 0;}Vergleich der Ansätze
Die Wahl des Werkzeugs
Auch in der Bibliothek
SceneKit für Swift: Das komplette 3D-Tutorial
OpenCV für C++: Vollständiger Leitfaden mit Beispielen
Arbeiten mit CSV in Node.js: Bibliotheken csv-parser und csv-writer