【发布时间】:2011-04-12 01:06:08
【问题描述】:
我正在尝试按字母顺序对 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数组会导致未定义的行为。你可能会向给你这个家庭作业的人提到这一点,如果你能在标准中找到引文,甚至可能会获得额外的学分(留给读者作为练习)。 -
是的,某些平台似乎可以从一些有趣的技巧中受益,因此未定义的行为似乎是合理的。另一方面,手册页示例与数组一起使用的事实可能表明并非如此。或者我们在手册页中发现了一个错误。 :-)
-
嗯,实际上,任务不是对 argv 数组进行排序。基本上,整个程序应该计算指定文件的字符数、单词数和行数并打印出结果,但按字母顺序排列。我的程序目前可以正确计算所有内容,但我需要找到一种方法使其按字母顺序打印出来,所以我认为对 argv 数组进行排序是一个好主意,因为所有文件名都在那里。无论如何,在按照你们的建议进行一些调整后,我可以将它打印到第一个文件及其计数的位置,但是......继续下面
-
然后我得到一个分段错误。当我得到分段错误时,我使用 printf 语句检查当前文件名是什么,它表明它是 LANG=en_US.UTF-8 ,我不知道那是什么......为了更清楚,我在命令行中指定文件 test1.txt hello.txt abcd.txt。并且使用 qsort(),我可以将它打印到输出 abcd.txt 的位置(按字母顺序排列)及其计数。但后来我得到一个分段错误并检查正在传递的文件名,我看到它的 LANG
-
...从上面继续,我看到它的 LANG=en_US.UTF-8 如果我不尝试对其进行排序,它可以完美运行,但会按照输入的顺序打印出来命令行。