Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
2年前关闭。
我正在尝试通过qsort对名称数组进行排序。
这是我的代码
此代码在末尾不会显示任何内容。它刚刚结束,因此似乎删除了char数组中的条目
这并不能解释为什么您没有正确排序,这是一个不同的问题,但是确实可以解释为什么您没有得到输出。 (验证编译器,例如
但是,这里还有许多其他问题。首先,正如其中一位评论者所提到的,
这是因为
其次,比较指针没有好处:指针在定义上几乎是随机值。书面的比较函数,即使您已针对应该存在的
从字面上看,这或多或少是“按内存中这些字符串的随机位置进行排序”,这根本无法帮助您将它们整理好。
正确的做法是不要再添加另一个星号(写
那就是你应该使用的。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
2年前关闭。
我正在尝试通过qsort对名称数组进行排序。
这是我的代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int myCompare (const void * a, const void * b ) {
return *(char*)a - *(char*)b;
}
int main(void) {
int i;
char fileArr[] = {"inputbv", "inputa","inputzef",};
int stringLen = sizeof(fileArr) / sizeof(char *);
qsort(fileArr, stringLen, sizeof(char *), myCompare);
for (i=0; i<stringLen; ++i)
printf("%d: %s\n", i, fileArr[i]);
}
此代码在末尾不会显示任何内容。它刚刚结束,因此似乎删除了char数组中的条目
最佳答案
首先,您缺少*
:
char *fileArr[] = {"inputbv", "inputa","inputzef",};
这并不能解释为什么您没有正确排序,这是一个不同的问题,但是确实可以解释为什么您没有得到输出。 (验证编译器,例如
gcc -Wall
,会告诉您该声明在没有缺少星号的情况下是无效的。)但是,这里还有许多其他问题。首先,正如其中一位评论者所提到的,
myCompare()
函数是用正确的类型声明的,但是它并没有完全按照您的想法做:int myCompare(const void *a, const void *b)
{
...
}
这是因为
qsort()
将地址传递给每个数据块,而不是数据本身。在这种情况下,数据块是指向字符数组的指针,因此qsort()
将传递指向比较函数指针的指针。那不是那里的单星。他们实际上是两颗变相的星星。其次,比较指针没有好处:指针在定义上几乎是随机值。书面的比较函数,即使您已针对应该存在的
*
个数进行了校正,也仍然会出错:/* Don't do this. */
return *(char **)a - *(char **)b;
从字面上看,这或多或少是“按内存中这些字符串的随机位置进行排序”,这根本无法帮助您将它们整理好。
正确的做法是不要再添加另一个星号(写
**(char **)a - **(char **)b
字面意思是“将第一个字符相互比较”)。正确的做法是调用strcmp()
以词法比较两个字符串:int myCompare(const void *a, const void *b)
{
return strcmp(*(char **)a, *(char **)b);
}
那就是你应该使用的。
关于c - qsort无法正常工作的c程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43215595/
10-12 20:38