比較しようとしている標準の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]
コメントを追加