C++如何比较两个字符串?(多种方法)

推荐使用std::string的==等运算符比较字符串;C风格字符数组则需用strcmp等函数,安全性与可读性较低。

在C++中比较两个字符串,核心要看你用的是哪种字符串类型:C风格字符数组(char[]const char*)还是标准库的 std::string。方法不同,安全性和可读性差别很大。

std::string== 和其他比较运算符

这是最推荐、最直观的方式。只要两个对象都是 std::string,直接用 ==!= 等即可,底层自动按字典序逐字符比较:

  • 比较结果是布尔值,语义清晰,不易出错
  • 自动处理长度,不会越界
  • 支持大小写敏感比较;如需忽略大小写,需手动转换(比如全转小写再比)

示例:

std::string a = "hello";
std::string b = "Hello";
bool equal = (a == b); // false,区分大小写
bool less = (a "Hello" 字典序!正确示例应为:"apple" 返回 true)

std::string::compare() 成员函数

这个函数功能更细,返回 int 值:

  • 返回 0 表示相等
  • 返回负数表示调用者小于参数
  • 返回正数表示调用者大于参数
  • 还支持子串比较,比如 s1.compare(pos, len, s2)

适合需要三态结果(小于/等于/大于)或做部分比较的场景。

用 C 风格函数 strcmp()(仅限 C 字符串)

如果操作的是以 \0 结尾的 const char*,可用 std::strcmp(需包含 ):

  • 返回 0 表示内容相同
  • 返回负数或正数表示字典序大小关系
  • ⚠️ 不检查空指针!传入 nullptr 会崩溃
  • ⚠️ 要求双方都以 \0 结尾,否则行为未定义

不建议在新代码中直接使用,除非对接 C API 或性能极端敏感且已确保安全。

大小写不敏感比较(常见需求)

标准库没提供现成函数,但有几种稳妥做法:

  • std::tolower 配合 std::equal:对两个字符串逐字符转小写再比较
  • 先用 std::transform 把两个 std::string 全转成小写,再用 ==
  • C++20 起可使用 std::ranges::equal + 自定义谓词,更简洁

注意:纯 ASCII 场景用 std::tolower 安全;涉及 Unicode 时需用 ICU 或其他国际化库,std::tolower 不适用。