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

时间:2010-09-14 08:02:47

标签: c sorting 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 ));
}

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

4 个答案:

答案 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);