我试图按字母顺序对argv的元素进行排序。
以下代码行给了我一些问题:
qsort(argv[optind], argc - optind, sizeof(argv[optind]), sort);
具体来说,最后一个参数给我带来了麻烦,即比较函数,如下所示:
int
sort(const void *a, const void * b)
{
return(strcmp( (char*)a, (char*)b ));
}
目前,它编译得很好,但是当我运行它时,我最终得到了一个分段错误。
答案 0 :(得分:3)
第一个参数应为argv+optind
,因为这是要排序的序列中第一个元素的地址。
答案 1 :(得分:3)
qsort(3)
的手册页包含一个示例,它完全符合您的要求。它还解释了原因:
http://linux.die.net/man/3/qsort
摘要:您在qsort()
第一个参数上缺少一级引用,并且在sort()
函数内缺少一个解除引用级别。
答案 2 :(得分:0)
这是我尝试排序argv
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 one two three four five six seven i: 1 ==> 'five' i: 2 ==> 'four' i: 3 ==> 'one' i: 4 ==> 'seven' i: 5 ==> 'six' i: 6 ==> 'three' i: 7 ==> 'two'
答案 3 :(得分:-1)
问题在于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);