【问题标题】:Weird behaviour in string comparison C++字符串比较 C++ 中的奇怪行为
【发布时间】: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" &lt; "111" 中,您比较的是指针而不是字符串。因为指针指向不同的不相关的对象,这会给你未定义的行为。
  • @HolyBlackCat 这应该是一个答案,而不仅仅是评论。
  • 查字典。 “动物园”出现在“土豚”之前还是之后?
  • "44" &lt; "111" 是未定义的行为。您可能正在比较字符串文字的地址值。
  • 来自cppreference.com: 一个由从data1开始的count1个字符组成的字符序列与一个由从data2开始的count2个字符组成的字符序列进行比较,如下所示。首先,计算要比较的字符数,好像通过 size_type rlen = std::min(count1, count2)。然后通过调用 Traits::compare(data1, data2, rlen) 比较序列。对于标准字符串,此函数执行逐个字符的字典比较。

标签: c++ string


【解决方案1】:
bool smaller2 = "44" < "111";  // <- returns true, CORRECT

没有。你只是走运了。那是比较字符串文字的地址,与 std::string 的实例不同。事实上,您可以将代码中的表达式替换为 "111"

按字典顺序比较字符串的正确方法:

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

【讨论】:

  • 谢谢。 stoi() 的问题在于我正在比较大整数(这就是我将它们作为字符串的原因)。如果字符串没有简单的方法,我可能不得不切换到一些库来获取任意长度的整数。
  • @pisoir 先比较长度,如果相等则使用&lt;
  • 但是负数会有问题
  • 我不在乎负数。 @selbie,是的,我也意识到了这一点。再次感谢。
猜你喜欢
  • 2021-09-07
  • 2011-09-13
  • 2011-09-18
  • 2011-10-07
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多