2016-10-06 3 views
-3

文字列の並べ替えを試みています。私はいくつかのテストをしていましたが、私は期待していないことを見つけました。私はそれを説明することはできません。辞書テストで "paul"の前に "test"が来るのはなぜですか?

if ("test" < "paul") 
{ 
    cout << "test is less than paul" << endl; 
} 

「テスト」が「ポール」よりも小さいのはなぜですか? 'p'は 't'よりもASCII値が低くなります。アルファベットのpの前にも来ます。どちらの場合も、文字列の長さは同じです。

私はswap()を使ってアルファベット順に配列をソートしています。私はsort()を使うことができません。私はswapを使う必要があります。

更新: 上記の例ではポインタを使用しましたが、これは実際のコードです。

DynamicArray<string> sectionName; //declaration 
swap(alreadySeen[i].sectionName[j],alreadySeen[i].sectionName[i]); //usage 

これは常に有効に警告してコンパイルする詳細

+3

文字列ではなくポインタを比較しています – KIIV

+2

これは辞書編集上の比較ではないためです。 – jtbandes

+2

"test"は "paul" ...の前に来ます! –

答えて

1

で迷子にしたくない、明らかに完全なコードではありません。

warning: comparison with string literal results in unspecified behavior [-Waddress] 
    if ("test" < "paul") 
        ^~~~~~ 

あなたはメモリアドレスを比較している、文字列を比較されていません。ここにはwandbox exampleがあります。あなたが望むものを達成するために

  • あなたの場合必要std::strcmpを使用して、Cスタイルの文字列を使用する:

    if(std::strcmp("test", "paul") < 0) { /* ... */ } 
    
  • あなたがstd::stringを使用できる場合は、することができます単に書いてください:

    if(std::string{"test"} < std::string{"paul"}) { /* ... */ } 
    
+0

std :: stringを使用すると、私にとって過度に思えるようです。しかし興味深い潜在的なボーナスがあります:文字列はロケールに敏感ですか? *単語*(意味的)の比較は一般的にロケールによって異なる場合があります。 –

+0

ありがとう私はあなたの答えが好きです。私は自分のコードを更新し、ポインタではなく文字列を使用しました。私は例のためのポインタを使ったと思います。 – asmcriminal

+0

@VittorioRomeo私はもともとあなたが言ったやり方で、それはそのエラーを生成します。 – asmcriminal

関連する問題