C语言qsort比较函数编写求助:升序降序排序结果不符合预期
qsort比较函数编写及问题排查
核心错误点
- 第一个错误:
Acal是double类型数组,调用qsort时第三个参数错误传入了sizeof(float),需改为sizeof(double)。qsort依赖该参数定位每个数组元素的内存位置,元素大小传错会导致内存读取完全错乱,排序逻辑自然不符合预期。 - 第二个错误:头文件里的比较函数声明不匹配,你实现的第二个比较函数名为
cmpfunc2,但头文件里声明的是int cmpfun2();,少了一个字符c;同时C语言中未写明参数列表的函数声明属于旧式声明,建议补全参数列表避免参数匹配错误。 - 隐含问题:你的代码中未包含
qsort对应的头文件<stdlib.h>,会触发函数隐式声明问题,也可能导致运行异常。
修正后的代码
比较函数(你写的比较逻辑本身符合要求,无需调整)
// double数组降序排序 int cmpfunc(const void *a, const void *b) { if (*(double*) a < *(double*) b) return 1; else if (*(double*) a > *(double*) b) return -1; else return 0; } // float数组升序排序 int cmpfunc2(const void *a, const void *b) { if (*(float*) a < *(float*) b) return -1; else if (*(float*) a > *(float*) b) return 1; else return 0; }
qsort调用部分
#include "stdio.h" #include "stdlib.h" // 新增qsort对应的头文件 int main(){ // 元素大小改为sizeof(double) qsort(Acal, 4, sizeof(double), cmpfunc); qsort(Value, 4, sizeof(float), cmpfunc2); }
头文件声明部分
typedef struct{ float Value[5] ; double Acal[5]; } value; // 修正函数名、补全参数列表 int cmpfunc(const void *a, const void *b); int cmpfunc2(const void *a, const void *b);
内容的提问来源于stack exchange,提问作者Marc Hammer
相关产品推荐
相关产品推荐

