Validación de datos en C++: revisión de bibliotecas y ejemplos prácticos
En el desarrollo moderno con C++, la validación de datos es una de las etapas clave en el procesamiento de la entrada del usuario, solicitudes de red o archivos de configuración. Sin una verificación confiable, la aplicación se vuelve vulnerable a datos incorrectos, lo que puede provocar fallos, fugas de memoria o errores lógicos. En este artículo, revisaremos los enfoques principales y las bibliotecas populares para la validación de datos en C++.
¿Por qué es necesaria la validación?
La validación resuelve tres tareas principales:
- Seguridad — prevención de la entrada de datos maliciosos (inyecciones SQL, desbordamiento de búfer).
- Corrección — garantía de que los datos corresponden al formato esperado (correo electrónico, número de teléfono, edad).
- Estabilidad — exclusión de fallos al convertir tipos (por ejemplo, cadena a número).
Bibliotecas para validación en C++
Consideremos varias soluciones populares que se pueden usar en proyectos de C++.
1. Boost.LexicalCast — verificación simple de números
La biblioteca Boost.LexicalCast permite convertir de forma segura cadenas a números y viceversa. En caso de error, se lanza la excepción boost::bad_lexical_cast.
#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 — validación de estructuras JSON
Para verificar datos JSON, a menudo se usa la biblioteca ligera PicoJSON. Permite analizar JSON y verificar la presencia de campos obligatorios.
#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>(); // Verificamos la presencia del campo "name" de tipo string if (obj.count("name") == 0 || !obj["name"].is<std::string>()) return false; // Verificamos el campo "age" — debe ser un número y > 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. Patrón Validator (implementación propia)
Si se necesita una regla de validación flexible, se puede implementar una clase validadora propia. Ejemplo para verificar una dirección de correo electrónico:
#include <regex>#include <string>#include <iostream>
class EmailValidator {public: bool validate(const std::string& email) const { // Expresión regular simple para email 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;}Comparación de enfoques
La elección de la herramienta