推荐使用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 值:
立即学习“C++免费学习笔记(深入)”;
- 返回 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 不适用。









