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没有。它需要两个const void*,但你有两个const void**
2)一旦你修复了类型,你就可以传递compareqsort,而不是创建一个函数指针并传递它。
3)我不相信第一个论点qsort是正确的。您希望将指针传递给数组中的第一个元素,这应该只是fileList(我假设它指向数组中的第一个字符串)。
4)第三个论点也不正确。fileList是 a char**,这意味着您要传入一个char *s 数组,因此第三个参数应该只是s sizeof(char*),而不是strlen字符串的 s。

于 2013-08-22T22:21:40.633 回答
1

我会调整一些东西,以便您只是对一个简单的数组进行排序,在这种情况下是指向 char 的指针 -qsort将安排您获取指向该数组中两个元素的指针(即char **指针),并且需要一些基本的取消引用来让您通过strcasecmp. @Mark 可能已经在你看不见的调用代码中找出了 260 的来源,但我不是 C 中那些类型的 2d 数组的忠实粉丝。

以下函数对我来说,用一个例子 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 回答