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;
<
比較は辞書編集であると定義されます。
'strcmp'を使用して文字列を比較します。 –
2番目のケースでは、2つの文字列オブジェクトを比較していません。以下は最初のケースと同じように動作します: 'cout <<(std :: string(" Banana ")
DeiDei
@ThanePlummerいいえ、これはC++です。 – emlai