0

よし、C でかなり長い文字列をいくつか作成する必要がある。

だからもちろん私はそうします、そしてここに彼女はいます:

int string_comparator(const void* el1, const void* el2) {

char* x = (char*) el1;
char* y = (char*) el2;

int str_len = strlen(x);
int i = 0;
for (; i < str_len; i++) {

    //when there are non-equal chars
    if (x[i] != y[i]) {
        break;
    }
}

return x[i] - y[i];
}

したがって、もちろん、便利でダンディな string_comparator 関数を次のように C の qsort 関数に渡します。

qsort(list.words, list.num_words, sizeof(char*), string_comparator);

list は、char** (単語) と、それによって保持される単語の数を参照する int (num_words など) を保持する構造体です。

今、私が望んでいたようにリストがアルファベット順にソートされないという問題があります! コンパレーターに一連の printf ステートメントを入れたところ、毎回文字列のガベージ値が出力されたので、それが問題であると確信しています。しかし、なぜそれが問題なのですか?? 以前に qsort を使用したことがあります(単語をソートすることはありません..文字をソートするだけです)。

提案に感謝します!

4

1 に答える 1

4

これは、 を使用する際によくある間違いqsort()です。ここに修正があります:

char *x = *(char **) el1;
char *y = *(char **) el2;

list.wordstypechar **ではなく typeを持っているからchar *ですよね?

別の例qsort()

intwithの配列をソートする方法は次のqsort()とおりです。

int int_comparator(const void *el1, const void *el2)
{
    int x = *(int *) el1;
    int y = *(int *) el2;
    return x - y;
}

void sort_ints(int *a, size_t n)
{
    // these two lines are both "correct"
    // the second line is more "obviously correct"

    // qsort(a, n, sizeof(int), int_comparator);
    qsort(a, n, sizeof(*a), int_comparator);
}

ここで、 を通過して に置き換えるint場合char *は、 に置き換える必要がありint *ますchar **

于 2012-12-07T06:19:42.620 に答える