文字列比較C ++での奇妙な動作

ピソワール

比較しようとしている標準の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」<「111」の場合に当てはまるはずです。

コード全体は次のようになります。

#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でMinGW16.1のg ++​​(GCC)8.2.0を使用しています。ここで何かが足りませんか?どうすれば正しい結果が得られるように強制できますか(短い文字列は長い文字列よりも小さいです)。ありがとう。

セルビー
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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

文字列比較によるC ++の奇妙な動作

分類Dev

C配列での奇妙な動作

分類Dev

C#の奇妙な文字列の動作?

分類Dev

C ++でのoperator =の奇妙な動作

分類Dev

Matlab配列での奇妙な動作

分類Dev

c ++ ioでの奇妙な動作

分類Dev

C ++での奇妙な参照動作

分類Dev

奇妙なGroovy / Java文字列比較動作

分類Dev

Cで「文字列」を返すときの奇妙な動作

分類Dev

文字列を比較するJUnitの奇妙な動作の練習

分類Dev

C ++ ostringstreamの奇妙な動作

分類Dev

C ++の奇妙な動作VisualStudio

分類Dev

C scanf の奇妙な動作

分類Dev

JAVAでの空の文字列の奇妙な動作

分類Dev

Cで文字列配列の要素を出力するときの奇妙な動作

分類Dev

文字列EndsWithメソッドのEntityFrameworkLinqでの奇妙な動作

分類Dev

Canvas / JSでの奇妙な文字列の動作

分類Dev

大きな配列でのC ++ / CUDAの奇妙な動作

分類Dev

文字列の比較、c ++

分類Dev

C ++で文字列に文字を挿入する際の奇妙な動作

分類Dev

奇妙な文字列プールの動作

分類Dev

Java文字列の奇妙な動作

分類Dev

奇妙なnull文字列の連結動作

分類Dev

Javascriptで文字列を分割する際の奇妙な動作

分類Dev

Pythonで文字列を置き換える際の奇妙な動作

分類Dev

Cカーネルでの文字列リテラルの奇妙な動作

分類Dev

C ++の奇妙な文字列/文字*の例外動作

分類Dev

Cでの奇妙な行列配列の動作

分類Dev

C ++の奇妙な配列の動作