直接用 == 比较 std::String 最安全高效,但需避免与可能为 nullptr 的 const char* 混用;compare() 更灵活但无空指针防护;区分大小写是默认行为,不区分时应谨慎处理 locale 和 unicode。

用 == 直接比较 std::string 是最安全的做法
只要两个变量都是 std::string 类型,直接用 == 判断相等即可,不需要手写循环或调用 c_str()。c++ 标准库已重载该运算符,语义清晰、效率高、自动处理空值和长度差异。
常见错误是把 std::string 和 C 风格字符串(const char*)混用后仍强行用 ==,比如:
<pre class="brush:php;toolbar:false;">std::string s = "hello"; if (s == "hello") { ... } // ✅ 正确:编译器会隐式构造临时 string
但下面这种就容易出问题:
<code>const char* p = nullptr; std::string s; if (s == p) { ... } // ❌ 可能崩溃:p 为 nullptr 时,隐式转换会触发未定义行为
- 永远确保右侧不是裸指针,尤其不能是可能为
nullptr 的 <code>const char* - 若必须和 C 字符串比较,先判空再用
s.c_str() == std::strcmp(...),或更推荐用s == std::string_view(p)(C++17 起) -
==比较区分大小写;不区分大小写需手动转小写或用std::equal配合std::tolower
compare() 方法适合需要三态结果或子串比较的场景
std::string::compare() 返回 int:0 表示相等,负数表示当前字符串小,正数表示大。它比 == 更底层,也更灵活。
立即学习“C++免费学习笔记(深入)”;
典型用途包括:
- 字典序排序(如传给
std::sort的自定义比较函数) - 只比较前 N 个字符:
s1.compare(0, n, s2) - 比较子串:
s1.compare(pos1, len1, s2, pos2, len2) - 避免隐式构造临时对象(对性能敏感路径)
注意:compare() 不做空指针防护,传入 nullptr 会直接导致未定义行为;且参数顺序易错——第一个参数是起始位置,不是长度。
别用 strcmp 直接比较 std::string
有人习惯写 strcmp(s1.c_str(), s2.c_str()) == 0,这在大多数情况下“能跑”,但有隐患:
-
s1或s2为空时,c_str()返回合法指针,没问题;但如果 string 对象本身是 move 后的无效状态,c_str()行为未定义 - 如果 string 包含嵌入的