27

C++ で ">" や "<" などの演算子を使用して文字列を比較すると、辞書式に比較されると思いましたが、問題は、これが私のコンピューターで時々しか機能しないことです。例えば

if("aa" > "bz") cout<<"Yes";

これは何も出力しません。それが必要ですが、入力すると

if("aa" > "bzaa") cout<<"Yes";

これは「はい」と出力されますが、なぜこれが起こっているのですか? または、辞書順で文字列を比較するために使用する必要がある他の方法はありますか?

4

3 に答える 3

39

std::string-s を比較するとうまくいきます。ただし、文字列リテラルを比較しています。必要な比較を行うには、それらで std::string を初期化するか、strcmp を使用します。

if(std::string("aa") > std::string("bz")) cout<<"Yes";

これは、それに対する C++ スタイルのソリューションです。

または、次のようにします。

if(strcmp("aa", "bz") > 0) cout<<"Yes";

EDIT(Konrad Rudolphのコメントに感謝):実際、最初のバージョンでは、オペランドの1つだけを明示的に変換する必要があります。

if(std::string("aa") > "bz") cout<<"Yes";

再び期待どおりに動作します。

EDIT(churillのコメントに感謝):c ++ 14以降、文字列リテラルを使用できます:

if("aa"s > "bz") cout<<"Yes";
于 2013-01-12T19:39:36.787 に答える
7

タイプがである「プリミティブ」文字列を比較していますchar const *

以下は、基本的にあなたの例と同等です。

char const * s1 = "aa";
char const * s2 = "bz";
if ( s1 > s2 ) cout<<"Yes";

これは、内容ではなく、ポインタ(文字列のメモリアドレス)を比較しています。

@izomorphiusはいくつかの良い解決策を提案しました。

于 2013-01-12T20:04:23.770 に答える