You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言使用qsort对date日期结构体排序仅生效天字段该如何解决

问题根因

你当前的排序逻辑错误核心出在cmpfunc比较函数的实现上:
qsort传入的两个参数是指向struct date类型的指针,你直接将其强转为int*解引用,只会拿到结构体第一个成员giorno(日)的值,整个比较逻辑完全没有考虑月份、年份字段,所以最终只会按日期的“日”字段排序。
另外你读取文件的leggi_file函数中存在扩容逻辑错误:当前的判断条件if(dim >= (*size))会导致数组刚写入第一个元素就触发扩容,正确逻辑应该是当已存储元素数量大于等于当前容量时再扩容,否则会出现数组越界访问的隐患。

解决方法

1. 重写日期比较函数

比较逻辑按照优先级排序:先比较年份,年份小的日期更早;年份相等再比较月份;年月都相等再比较日,符合从小到大升序排列的要求。
修正后的比较函数代码如下:

int cmpfunc(const void *a, const void *b){
    // 先把void指针转为对应struct date类型的指针
    const struct date *da = (const struct date *)a;
    const struct date *db = (const struct date *)b;
    // 先比年份
    if(da->anno != db->anno){
        return da->anno - db->anno;
    }
    // 年份相同比月份
    if(da->mese != db->mese){
        return da->mese - db->mese;
    }
    // 年月都相同比日
    return da->giorno - db->giorno;
}

2. 修复文件读取的扩容逻辑

将leggi_file函数中的扩容判断条件修改为:

// 原错误逻辑:if(dim >= (*size))
if(*size >= dim){
    dim *= 2;
    if(!(d = realloc (d, dim * sizeof(struct date))))
        return NULL;
}

修改完成后重新编译运行,即可实现日期从早到晚的升序排列。

内容的提问来源于stack exchange,提问作者socrate23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:06:06