質問

クラスのプロジェクトは、このような列の同じ数を含む各文字列で、文字列の配列をソートすることを含みます

Cartwright   Wendy    93
Williamson   Mark     81
Thompson     Mark     100
Anderson     John     76
Turner       Dennis   56

このプログラムは、上の並べ替えるには、列のためのコマンドライン引数を受け付け、そのままソート文字列を印刷する必要があります。

私はこのような各ラインのための構造体をカラムに各文字列のコピーを壊すためにはstrtokを使用し、したいと思います

struct line {
    char * line;
    char column_to_sort_on[MAX_COLUMN];
}

この私の問題は、qソートが引数として取る比較関数ポインタです。私が正しく理解していれば、比較関数は、のソートされているアイテムに2つのconstのボイドポインタがを取り、int型を返す必要があります。これは、それがqソートがソートされるものではありませんので、私は比較関数に構造体へのポインタを渡すことはできませんを意味します。それは2つのだけ引数を取ることができますので、私は、比較関数へ並べ替えるには、列番号を渡すことができません。どのように私は特定の列に基づいて、これらの文字列をソートするためにこれを回避することができますか?

編集:私が本当にしたい場合はのソートは、qソートする限定されたか、私自身です。私はqsortを選択し、選択肢を与えます。 :)

編集#2:のコンセンサスがどちらか列番号のためのグローバル変数を使用するか、または単に構造体の配列をソートするためのqsortを使っているようです。私は構造体を並べ替えて、元の文字列をプリントアウトするためにそれらにポインタを使用するのでは考えていませんでした。私はそれは私が何をするかだと思います。助けてくれてありがとうすべて!

役に立ちましたか?

解決

あなたは、このような構造体を渡すことができます

struct line {
    char * line;
    char column_to_sort_on[MAX_COLUMN];
}
...

line*  Lines[max_lines]; // here you store the structs

int
cmp_lines( const void *elem1, const void *elem2 )
{
    line*  line1 = *(line**)elem1;
    line*  line2 = *(line**)elem2;
    // do the comparisons
}

qsort(Lines, max_lines, sizeof(line*), cmp_lines);

他のヒント

あなたはqsort関数を使用することに限定されていないと仮定すると、あなたは列番号を格納ファンクタのオブジェクトと、STD ::並べ替えを使用することができます。あなたはqsort関数を使用する必要がある場合は、1つの迅速かつ汚いソリューションは、グローバル変数に列番号を格納し、comparisson機能でそれを使用することです。

全体の構造体を取るすべてが異なるコンパレータ機能、が、それぞれがcomparationための1列のみを使用します。

C ++やC?あなたのタグに基づいて、私はそれがC ++だと仮定します。のは、STLの方法を試してみましょう。

あなたはstd::sortの代わりにqsortを使用する必要があります。 std::sortが(そのC代替と比較して)だけでなく、関数ポインタを取ることができるが、任意のオブジェクトがの関数として呼び出すことができます。あなたは、クラスのインスタンスがoperator()を持つ関数として呼び出すことができることを知っているかもしれません。その後、溶液は簡単です:建設時に異なる機能を作成する「ファンクタ」クラスを作成します。ソート・コールは、そのようになります:

std::sort(array, array+size, comparator(2 /* sort by column #2 */));

数子クラスは、効果的に、いわゆる「閉鎖」を作成:ローカル変数を持って、動的に作成された機能オブジェクトを、しかし、この方法で作成した他の機能オブジェクトとそれらを共有することはありません。それは次のようになります:

class comparator{
  private: unsigned int field_n;
  public: comparator(unsigned int _field_n) : field_n(_field_n) {};
  public: int operator () (char const *  lhs, char const * rhs)
       { /* compare here fields with index field_n */ };
};

あなたは型キャストを自分で気にしないので、代わりに空ポインタの比較「機能」(作成した、すなわちクラスのインスタンス)の、パラメータをchar *た注意ます。

Cで、残念ながら、あなたはこのにグローバル変数を作成するよりも、他の方法を行うことはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top