2

私は qsort を使用するのが初めてで、定義済みの double の配列を qsort しようとしていますが、残念ながら、配列が qsort を使用してソートされた後、受け取る結果はすべて 0 です。私は完全に迷っており、アドバイスをいただければ幸いです。この double の配列をソートするために使用しているコードを次に示します。

static int compare (const void * a, const void * b){
    if (*(const double*)a > *(const double*)b) return 1;
    else if (*(const double*)a < *(const double*)b) return -1;
    else return 0;  
}

double stuff[] = {255, 1, 5, 39.0};
qsort(stuff, 4, sizeof(double), compare);
int i;
for(i = 0; i < 4; i++){
    printf("%d %s", stuff[i], " ");
}
4

2 に答える 2

1

すでに述べたように、問題はprintf(): (使用した) で使用した書式指定子にあります。これはs;%dには適していません。ordoubleのようなものを使用する必要があります。詳細については、StackOverflow に関するこの Q&A を参照してください。%f%g

何かのようなもの:

printf("%g ", stuff[i]);

大丈夫なはずです。

"%s"(どちらにも単一スペースの文字列リテラルを渡す必要はないことに注意してくださいprintf()。)

compare()さらに、関数をより適切に記述する方法を示したいと思います。

  1. void*(醜い) キャストの繰り返しを避け、コードをより明確で読みやすくするために、生のポインターを関数本体の先頭にある定数値に割り当てることができます。

  2. if...else if...else構造を単純化し、より単純な構造を使用したい場合がありますif...return

このようなもの:

static int compare(const void * a, const void * b) 
{
    const double lhs = *(const double *)a;
    const double rhs = *(const double *)b;

    if (lhs > rhs)
        return 1;

    if (lhs < rhs)
        return -1;

    return 0;
}
于 2013-09-20T10:44:59.010 に答える