0

文字列のリストを並べ替えたい。関数のパラメータにqsort()は、次のように定義されたc[i]のリストがあります。

    //N is the number of words
    int N;
    scanf("%d",&N);
    //each c[i] is a word 
    char **c;
    c = malloc(N*sizeof(char*));

    for(i = 0; i < N; i++)
    {
      char *temp[100];
      scanf("%s", &temp);
      c[i]=strdup(temp);
    }

しかし、リストを並べ替えると、結果が間違っています。

正確にデバッグするために、これを追加しました

for(i = 0; i < N; i++){
  j=compare (c[0],c[i]);
  printf("%d",j);
  printf("%s",c[i]);
}

私の入力は「4;a;b; c; d」で、「0b-1c-1d1a」を取得します

誰かがこれについて助けることができますか?

4

1 に答える 1

2

これは正しくありません:

char *temp[100];
scanf("%s", &temp);

temp100は初期化されていないchar*ポインタの配列であり、のストレージはありませんchar[]。への変更:

char temp[100];
scanf("%99s", temp); /* Added maximum number of chars to prevent overrun. */

あなたのコメントから:

int compare(const void* l, const void* r)
{
    return strcmp(l, r);
}

これは次のようになります。

int compare(const void* a1, const void* a2)
{
    const char** s1   = a1;
    const char** s2   = a2;
    return strcmp(*s1, *s2);
}

C99標準セクション7.20.5.2からqsort関数

配列の内容は、比較対象のオブジェクトを指す2つの引数を使用して呼び出される、comparが指す比較関数に従って昇順で並べ替えられます。この関数は、最初の引数がそれぞれ2番目の引数よりも小さい、等しい、または大きいと見なされる場合、ゼロより小さい、等しい、またはより大きい整数を返すものとします。

つまり、compare()関数の引数の型はであるchar**ため、文字列の比較を実行する前に逆参照する必要があります。

たとえば、http://ideone.com/rUG89を参照してください。

于 2012-08-29T13:10:04.477 に答える