2

qsortを使用して文字列の配列をソートしようとしました。ここに私の配列の内容があります:

{"a","orange","apple","mobile","car"}

これは私がqsortを使用する方法です:

int myCompare (const void * a, const void * b ) {
  const char *pa = (const char*)a;
  const char *pb = (const char*)b;
  return strcmp(pa,pb);
}

int stringLen = sizeof(input)/sizeof(char *);
qsort(input, stringLen, sizeof (char*), myCompare);

ただし、配列を印刷しても何も変更されません。これで何か問題がありますか?

4

3 に答える 3

10

myCompare関数をMitchWheatが以前に投稿したものに変更しましたが、これは正しく機能します。次に例を示します。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int myCompare (const void * a, const void * b ) {
    const char *pa = *(const char**)a;
    const char *pb = *(const char**)b;

    return strcmp(pa,pb);
}

int main() {
    int i;
    const char *input[] = {"a","orange","apple","mobile","car"};

    int stringLen = sizeof(input) / sizeof(char *);
    qsort(input, stringLen, sizeof(char *), myCompare);

    for (i=0; i<stringLen; ++i)
        printf("%d: %s\n", i, input[i]);
}

これは戻ります:

0: a
1: apple
2: car
3: mobile
4: orange
于 2013-02-21T02:17:47.190 に答える
4

qsort(input, stringLen, sizeof (char*), myCompare)myCompareソートされた文字列を比較するための呼び出し。

myCompare比較された値へのポインターを取得します。この場合、文字列 ( ) へのポインターを取得しますconst char**。したがって、 andが指す文字列である*(const char**)aandを比較する必要があります。*(const char**)bab

于 2015-05-24T09:57:41.590 に答える
2

次の方法でデバッグを開始します。

int myCompare (const void * a, const void * b ) {
  const char *pa = (const char*)a;
  const char *pb = (const char*)b;

  printf("Comparing %s vs. %s for result %d\n", pa, pb, strcmp(pa,pb));

  return strcmp(pa,pb);
}

その後すぐに、問題を理解できると思います。:)

于 2013-02-21T02:05:36.043 に答える