1

wordテキスト ファイルから、並べ替えの準備ができているという名前の 2D 配列に読み込まれた文字列のリストが既にあります。

リストは次のようになります。

I
like
cherry
pie
and
chocolate
pie

並べ替えた後、リストを次のように表示します。

and
cherry
chocolate
I
like
pie
pie

関数のプロトタイプは以下です。int counterは文字列の量ですMAX_CHAR_LEN = 1024

void alphabetize(char word[][MAX_CHAR_LEN], int counter)
{

    return;
}

リストには「ch」で始まる 2 つの文字列が含まれているため、最初の文字だけで並べ替えるだけでは不十分であることに注意してください。

誰かがこれを行うことができる機能を提供できますか? 前もって感謝します。

4

4 に答える 4

2

機能を使用したいqsort()

qsort(base, num_of_elements, element_size, my_compare);

比較関数my_compareは 2 つの引数 (それぞれ a ) を取りconst void *、引数の相対的な順序を示す数値を返します。負の数は、最初の引数が 2 番目の引数の前にあることを意味します。正の数は、最初の引数が 2 番目の引数の後にあることを意味します。引数が等しいと比較された場合、ゼロが返されます。

文字列比較では大文字と小文字が区別されないため、独自の比較関数を作成するか、C ライブラリに含まれていないシステムから提供された関数を見つける必要があります。POSIX はstrcasecmp()この目的のために_stricmp()用意されています (Google によると、これは Windows で利用可能です)。

int my_compare (const void *a, const void *b) {
    return strcasecmp(a, b);
}

通常、比較関数の定義は、 を使用する上で最も難しい部分ですqsort()。その関数に渡されるポインターのコンテキストを理解する必要があります。の配列TYPEが に渡されると、比較関数の各引数へqsort()のポインタが渡されます。const TYPE

あなたの場合、MAX_CHAR_LEN chars の配列の配列を渡します。したがって、比較関数の各引数は、MAX_CHAR_LEN chars の const 配列へのポインターです。これは、技術的には、my_compare関数を次のように記述する必要があることを意味します。

int my_compare (const void *a, const void *b) {
    typedef char TYPE[MAX_CHAR_LEN];
    const TYPE *aa = (const TYPE *)a;
    const TYPE *bb = (const TYPE *)b;
    return strcasecmp(*aa, *bb);
}

C が定数配列の概念を実際にサポートしていないことを除いて、引数のキャストは通常​​は必要ありません。そのようなものを定数の配列に変換するため、キャストはそれを反映する必要があります。

ただし、配列のアドレスは、その最初の要素のアドレスと同じです。つまり、上記のコードの場合、次のアサーションが true になります。

    assert(aa == (const void *)*aa);
    assert(bb == (const void *)*bb);

したがって、配列へのポインターの逆参照は、同じ配列の減衰したアドレス値と等しいmy_compare()ため、2 次元配列には の最初の実装で十分です。

于 2013-07-19T23:23:32.727 に答える
1

qsort関数を使用して並べ替えることができます。また、char の 2 つの配列を比較する比較関数を作成し、その関数ポインターを引数として渡す必要もあります。

int をソートする例:

/* qsort example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */

int values[] = { 40, 10, 100, 90, 20, 25 };

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

int main ()
{
  int n;
  qsort (values, 6, sizeof(int), compare); 
  for (n=0; n<6; n++)
     printf ("%d ",values[n]);
  return 0;
}

上記のコードは、int ではなく char の配列をソートするように簡単に変更できます。

于 2013-07-19T23:17:13.253 に答える
0

独自のソート関数を作成したい場合、このようなものは非常に簡単です。

for (int i = 0; i < array.size(); i++)
{
    for (int j = i+1; j < array.size(); j++)
    {
        if (array[i] > array[j])
            swap(array[i],array[j]);
    }
}
于 2013-07-19T23:17:52.020 に答える
0

qsort良いオプションです。詳細はこちら

バブル ソートを試すこともできます。Cでの実装は簡単です-ヘルプについては、この良い回答を参照してください

于 2013-07-19T23:20:40.577 に答える