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
相关产品推荐
相关产品推荐

