【发布时间】:2019-03-24 18:36:47
【问题描述】:
我正在使用我尝试比较的标准 std::string 变量。然而,很奇怪的是,我得到了奇怪的结果:
string str1 = "44", str2 = "111";
bool smaller1 = str1.compare(str2) > 0; // <- returns true, although should be false
bool smaller2 = "44" < "111"; // <- returns true, CORRECT
string str3(2, '4'), str4(3, '1');
bool small3 = str3 < str4; // <- returns false, although should be true
我希望因为一个字符串比另一个字符串短,所以对于“44”
整个代码如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1 = "44", str2 = "111";
string str3(2, '4'), str4(3, '1');
bool cmp1 = str1 < str2,
cmp2 = "44" < "111",
cmp3 = str3 < str4,
cmp4 = str3.compare(str4) < 0;
std::cout << "1: " << cmp1 << "\n";
std::cout << "2: " << cmp2 << "\n";
std::cout << "3: " << cmp3 << "\n";
std::cout << "4: " << cmp4 << "\n";
return 0;
}
然后返回:
1: 0
2: 1
3: 0
4: 0
我在 Windows10 上使用来自 MinGW 16.1 的 g++ (GCC) 8.2.0。我在这里错过了什么吗?我怎样才能强迫它给我正确的结果(较短的字符串小于较长的字符串)。 谢谢。
【问题讨论】:
-
"对于
"44",字典顺序应该总是给我正确的"111"" 为什么应该这样?因为"111"的第一个字符小于"44"的第一个字符,所以"111"在字典上小于"44"。接下来,在"44" < "111"中,您比较的是指针而不是字符串。因为指针指向不同的不相关的对象,这会给你未定义的行为。 -
@HolyBlackCat 这应该是一个答案,而不仅仅是评论。
-
查字典。 “动物园”出现在“土豚”之前还是之后?
-
"44" < "111"是未定义的行为。您可能正在比较字符串文字的地址值。 -
来自cppreference.com: 一个由从data1开始的count1个字符组成的字符序列与一个由从data2开始的count2个字符组成的字符序列进行比较,如下所示。首先,计算要比较的字符数,好像通过 size_type rlen = std::min(count1, count2)。然后通过调用 Traits::compare(data1, data2, rlen) 比较序列。对于标准字符串,此函数执行逐个字符的字典比较。