C语言借助qsort实现结构体日期数组排序的问题调试咨询
代码错误定位
- qsort比较函数签名不符合C标准
C语言标准库qsort要求比较函数必须满足两个硬性要求:一是返回值为int类型,二是两个入参为通用无类型指针const void*。当前代码定义的比较函数返回bool类型、入参为强类型的date*指针,属于函数指针类型错配,会触发未定义行为,qsort无法正确解析比较逻辑。 - qsort元素大小参数传值错误
qsort的第三个参数需要传入单个待排序元素的内存占用字节数,当前代码传入的sizeof(data)/sizeof(date)实际计算结果为数组总长度n,相当于告知qsort每个元素占n个字节,最终整个数组仅能被识别为1个待排序元素,完全无法遍历所有日期数据。 - 比较函数返回逻辑不符合qsort约定
qsort的返回值需遵循统一规则:第一个元素应排在第二个元素之前时返回负整数;两元素相等返回0;第一个元素应排在第二个元素之后时返回正整数
原代码用布尔值返回比较结果,仅能输出0/1两个值,既没有负返回值,也无法区分两元素相等和逆序的场景,即使修正函数签名也无法完成正确排序。
修正后的可运行代码
#include <stdio.h> #include <stdlib.h> typedef struct date{ int day; int month; int year; }date; int compare(const void *p1, const void *p2){ // 将无类型指针转换为实际的日期结构体指针 const date *d1 = (const date*)p1; const date *d2 = (const date*)p2; // 按年、月、日的优先级依次比较 if(d1->year != d2->year){ return d1->year - d2->year; } if(d1->month != d2->month){ return d1->month - d2->month; } return d1->day - d2->day; } int main(void){ int n; int i; scanf("%d",&n); date data[n]; for(i=0;i<n;i++){ scanf("%d %d %d", &data[i].day, &data[i].month, &data[i].year); } // 修正为传入单个date结构体的大小 qsort(data, n, sizeof(date) ,compare); for(i=0;i<n;i++){ printf("%d %d %d \n",data[i].day,data[i].month,data[i].year); } return 0; }
内容的提问来源于stack exchange,提问作者user14278719
相关产品推荐
相关产品推荐

