2015-10-28 5 views
12

対文字列の要素次のコードを印刷は、文字列

1 
0 

を比較し、比較は同じ文字列を使用している場合、値が異なる理由を、私は思ってきた...私はしばらくの間、これで苦労してきました異なるブール値を返す理由を理解できません。

int main() 
{ 
    string stringArray[] = { "banana","Banana","zebra","apple","Apple","Zebra","cayote" }; 

    cout << (stringArray[1] < stringArray[0]) << endl; 
    cout << ("Banana" < "banana") << endl; 

    return 0; 
} 
+0

'strcmp'を使用して文字列を比較します。 –

+2

2番目のケースでは、2つの文字列オブジェクトを比較していません。以下は最初のケースと同じように動作します: 'cout <<(std :: string(" Banana ") DeiDei

+8

@ThanePlummerいいえ、これはC++です。 – emlai

答えて

8

"Banana" < "banana"は、文字列の内容を比較していません。 "Banana""banana"が解決するポインタを比較しています。

cstyle文字列をstd::stringに変換せずに比較するには、strcmp()を使用できます。

+1

'std :: string(" Banana ")

+2

@Ben:一時的な 'std :: string'を1つ作成するだけで十分です。私はおそらくこのように読みやすさのためにそれをやっているだろうが。 –

+1

@ NathanOliver: "たくさん"の定義については... :)確かに 'strcmp'を使用して3つの異なる結果を混乱させるよりもエラーが起こりにくいです。 (-1が最初または2番目が大きいことを意味するかどうか、またはそれが任意の負の数になることができるかどうかを調べるには、関数のドキュメントを読む必要があると告白する必要があります) –

16

stringArray[n]std::stringですが、"Banana"は文字列リテラル(charsの配列)です。

"Banana" < "banana"を実行すると、両方の文字列リテラルがcharポインタに暗黙的に変換され、char配列を指しています。 <はそれらのメモリアドレスを比較します。

7
string stringArray[] = { "banana","Banana","zebra","apple","Apple","Zebra","cayote" }; 

これは、個々の文字列リテラルから生じchar const* sから作成されたstd::stringオブジェクトの束を得ることを意味します。

は、単一std::string初期化を考えてみましょう:

std::string s = "..."; 

右側のリテラルはタイプchar const[4]です。それはstd::stringのコンストラクタによって使用されるchar const*に "崩壊"します。

文字列リテラルからオブジェクトstd::stringの配列を初期化する場合も同じことが起こります。 std::stringについて

cout << (stringArray[1] < stringArray[0]) << endl; 

<演算子を使用して辞書式比較を意味します。したがって、これは辞書編集による比較を使用しており、期待される結果が得られます。この場合

cout << ("Banana" < "banana") << endl; 

、関与しないstd::stringは存在しません。 2つをchar const[7]と比較します。

これはどういう意味ですか?それはまったく別のものです。両方のアレイは、最初の要素にchar const*まで「減衰」します。 2つの無関係なポインタを<と比較した結果、は不特定です。結果として0を受け取るのは幸いです。なぜなら、1を受け取ってもエラーを気付かないかもしれないからです。コンパイラはまた、例えば、このための警告を生成することができます。

warning: comparison with string literal results in unspecified behaviour 

だから、あなたが見ることができるように、この操作は辞書式の比較とは全く関係ありません。この問題を解決する

一つの方法は、std::stringにオペランドの少なくとも一方をオンにすることである:std::string及びchar const*(またはその逆)との間

cout << (string("Banana") < "banana") << endl; 

<比較は辞書編集であると定義されます。