C++中std::string关系运算符与string::compare()结果不一致问题
为什么std::string的
<运算符和compare()字符串比较结果不同? 测试代码如下:
#include <iostream> #include <string> using namespace std; int main() { string str = "100"; cout << str.compare("10") << endl; // 输出1 cout << ("100" < "10") << endl; // 输出1 }
按字典序"100"应大于"10",所以("100" < "10")预期输出0,但实际输出1,而str.compare("10")的结果符合预期,核心原因是两种比较的本质完全不同:
1. ("100" < "10"):比较的是指针地址
"100"和"10"都是C风格字符串字面量,编译时会被存入内存的只读数据段。当用<比较它们时,编译器不会对比字符串内容,而是直接比较这两个字面量在内存中的指针地址。
在你的测试环境中,"100"的内存地址恰好小于"10"的地址,所以表达式返回true(输出1),这个结果和字符串的字典序没有任何关系。
2. str.compare("10"):逐字符比较字符串内容
std::string的compare()成员函数是专门用于字符串内容比较的:
- 它会逐字符对比两个字符串,直到出现不同字符或其中一个字符串结束
- 这里前两个字符
'1'和'0'完全相同,"10"先结束,而"100"还有后续字符,因此判定"100"更大,返回大于0的整数(这里是1),符合字典序预期。
正确比较C风格字符串字面量的方法
如果要按字典序比较两个C风格字符串字面量,有两种可行方式:
- 使用C标准库的
strcmp函数:strcmp("100", "10"),返回值大于0表示前者更大 - 将其中一个字面量转为
std::string,触发std::string的关系运算符:std::string("100") < "10",此时会按内容比较,返回false(输出0)
内容的提问来源于stack exchange,提问作者router
相关产品推荐
相关产品推荐

