You need to enable JavaScript to run this app. C语言借助qsort实现结构体日期数组排序的问题调试咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 19:27:05