0

文字列の配列をソートしています (大文字と小文字を区別しません)。

qsort はセグメンテーション違反を引き起こします。おそらく私のキャストは適切ではありません。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void *string1, const void *string2) {
    char *a = (char*)(string1);
    char *b = (char*)(string2);
    printf("comparing %s     AND    %s\n", a, b);
    return strcasecmp(a,b);
}

void sortListName(char **fileList, int noOfFiles) {
    printf("Sorting\n");
    qsort(fileList, noOfFiles, 260*sizeof(char), compare); 
    return;     
}

**fileList = 文字列の配列 (ファイル名)

PS main() は明らかで、正常に動作します。

4

2 に答える 2

4

これが に関連するすべてのコードである場合qsort、関数ポインターを宣言したように見えますが、comparePtrまだ初期化されていません。compareそれはあなたの関数を指していません(これはあなたがそれを指し示したかったと思います)。

その後、さらにいくつかのこと:

1)comparePtr正しいタイプがありますが、そうでcompareはありません。2 つ取り込む必要がありますが、const void*2 つ持っていますconst void**
2) 型を修正したら、関数ポインタを作成してそれを渡す代わりに、compare単にに渡すことができます。 3) の最初の引数が正しいとは確信していません。配列の最初の要素へのポインターを渡したいと思っています。これは、配列の最初の文字列を指していると仮定しています)。 4) 3 番目の引数も正しくありません。はです。これは、s の配列を渡すことを意味します。したがって、3 番目の引数は、文字列の sではなく、 である必要があります。qsort
qsortfileList
fileListchar**char *sizeof(char*)strlen

于 2013-08-22T22:21:40.633 に答える
1

単純な配列 (この場合は char へのポインター) をソートするだけになるように調整します。qsortその配列内の 2 つの要素 (つまり、char **ポインター)へのポインターを取得するように調整します。を介して同等の「charへのポインター」を取得しますstrcasecmp。@Mark は、目に見えない呼び出しコードで 260 のソースを突き止めた可能性がありますが、私は C のそのような種類の 2 次元配列の大ファンではありません。

次の関数は、それを実行するための main() の例を示しています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int compare(const void *v1, const void *v2){
    char *a = *(char **)v1;
    char *b = *(char **)v2;

    printf("comparing %s to %s\n", a, b);

    return strcasecmp(a,b);
}


void sortListName(char **fileList, int noOfFiles){
    printf("Sorting\n");
    qsort(fileList, noOfFiles, sizeof(*fileList), compare); 
    return;

}

int
main(void)
{
    char *filenames[] = {
        "/var/www/icons/comp.gray.png",
        "/var/www/error/HTTP_SERVICE_UNAVAILABLE.html.var",
        "/var/www/icons/right.gif",
        "/var/www/error/HTTP_NOT_IMPLEMENTED.html.var",
        "/var/www/icons/pie3.png",
        "/var/www/icons/pie2.png",
        "/var/www/htdocs/manual/mod/mod_proxy_balancer.html",
        "/var/www/htdocs/manual/programs/rotatelogs.html",
        "/var/www/htdocs/manual/vhosts/mass.html",
        "/var/www/icons/movie.png",
        "/var/www/htdocs/manual/images/caching_fig1.png",
        "/var/www/htdocs/htdig/search.html",
        "/var/www/icons/generic.gif",
        "/var/www/htdocs/manual/mod/quickreference.html",
        "/var/www/icons/small/blank.png",
        "/var/www/icons/image2.gif"
    };

    int i, nf = (int) (sizeof(filenames) / sizeof(filenames[0]));

    puts("Unsorted:");

    for (i = 0; i < nf; i++) {
        puts(filenames[i]);
    }

    sortListName(filenames, nf);

    puts("Sorted:");

    for (i = 0; i < nf; i++) {
        puts(filenames[i]);
    }

    return 0;
}
于 2013-08-22T22:59:04.083 に答える