如何在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);