qsort 不工作的 c 程序
qsort not working c program
我正在尝试通过 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;
字面上差不多 "sort by the random locations of these strings in memory," 这对您整理它们根本没有帮助。
正确的做法是不要再添加一颗星(写作 **(char **)a - **(char **)b
字面意思是 "compare the first characters against each other")。正确的做法是调用 strcmp()
来按词法比较两个字符串:
int myCompare(const void *a, const void *b)
{
return strcmp(*(char **)a, *(char **)b);
}
这就是你应该使用的。
我正在尝试通过 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;
字面上差不多 "sort by the random locations of these strings in memory," 这对您整理它们根本没有帮助。
正确的做法是不要再添加一颗星(写作 **(char **)a - **(char **)b
字面意思是 "compare the first characters against each other")。正确的做法是调用 strcmp()
来按词法比较两个字符串:
int myCompare(const void *a, const void *b)
{
return strcmp(*(char **)a, *(char **)b);
}
这就是你应该使用的。