0

として宣言された配列をソートしようとしていますstring *names1 = new string[1];(配列のサイズは、アイテムを追加すると大きくなります)。

そこに弦を張っています。並べ替え前の配列の項目は次のとおりです。 novot svobodovaa novakj6 3 vondraj1234

を呼び出した後qsort(names1, size, sizeof (string), compare);、比較は次のように実装されます

int compare(const void * a, const void * b) {
return ( *(char*) a - *(char*) b);
}

私の配列のアイテムはこのようにスクランブルされています vondraj1234 novakj6 novot svobodovaa

配列をアルファベット順にソートできないバグはどこにあるのでしょうか。

4

2 に答える 2

3

でコピーできるタイプでのみ使用できます。(および自明でない代入演算子を持つ他のタイプ)は適格ではありません。代わりに、を使用してください。オブジェクトを正しくコピーする方法を知っています。qsortmemcpystd::stringstd::sort

于 2013-03-18T14:16:37.480 に答える
0

最初に、あなたの質問の質がやや悪いことを指摘しますが、ご容赦ください。

string *names1 = new string[1];

これにより、1 つの文字列オブジェクトの配列が得られます。

(配列のサイズは、項目を追加すると大きくなります)

間違い。うまくいけば、この特定の目的のためにコードを書いたので、配列のサイズがそうするかもしれませ配列のサイズは自動的に調整されません。(そのためのものvectorです。)

そこに弦を張っています。並べ替え前の配列の項目は次のとおりです。novot svobodovaa novakj6 3 vondraj1234

一列で?または文字列の配列として?後者の場合、次のような証明が必要です。

for ( size_t i = 0; i < size; ++i )
{
    std::cout << i << ": " << names1[i] << "\n";
}

理想的には、行の直前に:

qsort(names1, size, sizeof (string), compare);

size(私は、実際にの正しいサイズであることを望み、想定してnames1います。これは、上の私の小さなループが証明するもう 1 つのことです。)


ただし、問題の本当の理由は次の行です。

return ( *(char*) a - *(char*) b);

string *(オブジェクトへchar *のポインタ) を (プレーンな古いデータへのポインタ) にキャストしておりchar*、C++ スタイル ( static_cast< char * >()) ではなく C スタイル ( ) を行っているため、コンパイラは適切に文句を言うことさえできません。

これら 2 つのポインターを逆参照すると、2 つのstringオブジェクトの最初のバイトがそれぞれ取得されます。これはおそらく含まれている文字列の最初の文字ではなく、ジャンプ テーブルまたはマシン コードのいずれかです。したがって、ややランダムな結果...

于 2013-03-18T14:08:10.023 に答える