在C++中判断字符串是否相等,最直观的方式是使用std::string类并重载的==运算符。与C语言需要用strcmp函数不同,C++的string对象可以直接通过双等号进行比较,编译器会调用string类内部实现的operator==函数来完成内容比对。

C++ string判断相等的常见写法
使用std::string时,判断两个字符串相等的代码非常简洁:
#include <iostream>
#include <string>
int main() {
std::string a = "hello";
std::string b = "hello";
std::string c = "world";
if (a == b) {
// 输出:a与b相等
std::cout << "a与b相等" << std::endl;
}
if (a != c) {
// 输出:a与c不相等
std::cout << "a与c不相等" << std::endl;
}
return 0;
}
string重载==运算符的底层逻辑
std::string的==运算符通常基于basic_string的实现。其比较逻辑大致分为两步:
- 先比较两个字符串的长度,如果长度不同,直接返回false,避免逐字符比较。
- 如果长度相同,再调用类似char_traits::compare的函数逐字符比较内容,全部相同才返回true。
下面用一个简化版的自定义string来演示operator==的重载思路:
#include <cstring>
class MyString {
public:
MyString(const char* s) : len(strlen(s)) {
data = new char[len + 1];
strcpy(data, s);
}
~MyString() { delete[] data; }
bool operator==(const MyString& other) const {
// 先比较长度
if (len != other.len) return false;
// 再比较内容
return strcmp(data, other.data) == 0;
}
private:
char* data;
size_t len;
};
为什么C风格字符串不能用==比较
对于C风格字符串,例如char* s1 = "abc";和char* s2 = "abc";,使用s1 == s2比较的是指针地址而不是内容。若要用==判断相等,必须先将它们转为std::string对象,或者始终使用strcmp函数。
注意:即使两个C字符串内容相同,它们的指针也可能指向不同内存地址,所以==结果可能为false。
总结对比
| 比较方式 | 适用类型 | 比较内容还是地址 |
|---|---|---|
| ==运算符 | std::string | 比较内容 |
| ==运算符 | char* 或 const char* | 比较指针地址 |
| strcmp函数 | char* 或 const char* | 比较内容 |
因此在C++中判断字符串相等,推荐优先使用std::string与重载的==运算符,既安全又直观,也能借助长度预判断提升效率。