0

我正在尝试按字母顺序对 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

4 回答 4

3

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

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

摘要:您缺少对第qsort()一个参数的一级引用,并且缺少sort()函数内部的一级取消引用。

于 2010-09-14T08:36:28.460 回答
3

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

于 2010-09-14T08:10:11.713 回答
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);
于 2010-09-14T08:20:40.467 回答
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 一二三四五六七
我:1 ==>'五'
i: 2 ==> '四'
i: 3 ==> '一'
i: 4 ==> '七'
我:5 ==>'六'
我:6 ==>'三'
我:7 ==>'两个'
于 2010-09-14T08:44:31.890 回答