如何在C中对argv的元素进行排序?

我试图按字母顺序排序argv的元素。

以下代码行给了我一些问题:

qsort(argv[optind], argc - optind, sizeof(argv[optind]), sort); 

具体来说,最后一个参数给我带来了麻烦,即比较函数,如下所示:

 int sort(const void *a, const void * b) { return(strcmp( (char*)a, (char*)b )); } 

目前,它编译得很好,但是当我运行它时,我最终得到了一个分段错误。

第一个参数应该是argv+optind ,因为这是要排序的序列中第一个元素的地址。

qsort(3)的手册页包含一个示例,它完全符合您的要求。 它还解释了原因:

http://linux.die.net/man/3/qsort

简介:您缺少qsort()第一个参数的一级引用,并且缺少sort()函数内的一个解除引用级别。

这是我尝试排序argv

 #include  #include  #include  int mycomp(const void *a, const void *b) { /* function code removed to prevent homework copy/paste */ } int main(int argc, char **argv) { int i; qsort(argv + 1, argc - 1, sizeof *argv, mycomp); for (i = 1; i < argc; i++) printf("i: %d ==> '%s'\n", i, argv[i]); return 0; } 

并运行该程序的示例

 $ ./a.out一二三四五六七
我:1 ==>'五'
我:2 ==>'四'
我:3 ==>'一个'
我:4 ==>'七'
我:5 ==>'六'
我:6 ==>'三'
我:7 ==>'两个'

问题出在argv数组的结构中。

它的结构是这样的

 program\0arg1\0argument2\0a3\0\0 

qsort函数假定所有元素的大小相同,但在这种情况下它们不是。 您指定argv[optind]的大小,但并非所有元素都是该大小。

编辑 :我错了,你没有将字符串长度传递给qsort,而是指针的长度。 所以argv包含一个指针数组。 目标是对指针进行排序。

这意味着您将指针数组传递给qsort,并且sort函数应该指向一个指针。 像这样:

 int sort(const void *a, const void * b) { return(strcmp( *(char**)a, *(char**)b )); } qsort(argv+optind, argc - optind, sizeof(argv[optind]), sort);