我正在使用我尝试比较的标准std :: string变量。但是,很奇怪的是,我得到的结果很奇怪:
mappedTypes.Where(x => x.ReferenceId == new Guid("1a087b71-638c-4f3c-b1cf-3b0438c181c0"))
.Select(x => (Guid?) x.MappingId)
.FirstOrDefault();
我希望因为一个字符串比另一个字符串短,所以按顺序排列,对于“ 44” <“ 111”应该总是正确的。
整个代码如下:
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
并返回:
#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;
}
我正在Windows10上使用MinGW 16.1中的g ++(GCC)8.2.0。我在这里想念什么吗?如何强制它给我正确的结果(较短的字符串小于较长的字符串)。 谢谢。
答案 0 :(得分:2)
bool smaller2 = "44" < "111"; // <- returns true, CORRECT
不。你只是变得笨拙。这是在比较字符串文字的地址,而不是与std :: string实例相同。实际上,您可以在代码中将该表达式替换为“ 111” <“ 44”,并且如果编译器按照声明的顺序将内存中的字符串对齐,它可能会返回true。
按字典顺序比较字符串的正确方法:
std::string str1 = "44";
std::string str2 = "111";
bool cmp1 = (str1 < str2); // false, since '4' is greater than '1'
将字符串比较为整数的正确方法:
int val1 = std::stoi(str1); // 44
int val2 = std::stoi(str2); // 111
bool cmp2 = (val1 < val2); // true since 44 is less than 111