C++ 数据验证:库、模式与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++ 数据验证:库概述与实践示例

在现代 C++ 开发中,数据验证是处理用户输入、网络请求或配置文件的关键步骤之一。没有可靠的检查,应用程序容易受到无效数据的影响,可能导致崩溃、内存泄漏或逻辑错误。本文将介绍 C++ 中数据验证的主要方法和流行库。



为什么需要验证?

验证解决三个主要问题:

  • 安全性 — 防止恶意数据输入(SQL 注入、缓冲区溢出)。
  • 正确性 — 确保数据符合预期格式(电子邮件、电话号码、年龄)。
  • 稳定性 — 避免类型转换时的错误(例如,字符串转数字)。


C++ 验证库

让我们看看几个可以在 C++ 项目中使用的流行解决方案。



1. Boost.LexicalCast — 简单的数字检查

Boost.LexicalCast 库允许安全地将字符串转换为数字,反之亦然。出错时会抛出 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 — JSON 结构验证

对于 JSON 数据检查,通常使用轻量级库 PicoJSON。它允许解析 JSON 并检查必填字段是否存在。

#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>(); // 检查 "name" 字段是否为 string 类型 if (obj.count("name") == 0 || !obj["name"].is<std::string>()) return false; // 检查 "age" 字段 — 必须是数字且 > 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 模式(自定义实现)

如果需要灵活的验证规则,可以实现自己的验证器类。以下是电子邮件地址验证示例:

#include <regex>#include <string>#include <iostream>

class EmailValidator {public: bool validate(const std::string& email) const { // 简单的电子邮件正则表达式 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;}


方法比较

工具选择

推荐