1

以下のプログラムは、qsort()ライブラリ関数を使用して文字列のすべてのサフィックスを並べ替えます。

int sacomp(const void *a, const void *b) 
{
    return strcmp(*(const char**)a, *(const char**)b); <------------
}

void sort(string s) 
{
    int size = s.size();
    char const *data = s.c_str();
    char const **sa = new char const *[size+1];

    for(int i = 0; i < size; i++)
        sa[i] = data+i;

    qsort(sa, size, sizeof(sa[0]), sacomp); // O(n * Lon n)
}

int main() 
{
    string s("ABCCCDEFABBABBA");
    sort(s);

    return 0;
}

sacomp()メソッド で行われたキャストを理解できません。

strcmp(*(const char**)a, *(const char**)b); 

a が const char** にキャストされてから逆参照されるのはなぜですか?

4

2 に答える 2

1

qsort は要素のポインタを渡します。sa を as として渡しchar**たので、すべての要素はchar*であり、qsort は でありchar**、最終的にchar**sort 関数に入りました。

于 2012-08-19T11:31:39.697 に答える
0

あなたの要素はchar *であるため、 void on を変更し、 へのchar *ポインタを取得する必要がchar *ありますchar **。一方、 strcmp は必要char *です。

于 2012-08-19T11:35:39.760 に答える