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

C语言调用比较函数判断Student结构体数组是否有序问题

问题解决方案
  • 关于compar函数的调用问题
    你原代码中compar(i,i+1)的写法完全错误,compar要求的入参是两个指向待比较元素的指针,不是数组索引。正确的传参方式是compar(&stu[i], &stu[i+1]):stu是Student数组的首地址,&stu[i]就是第i个元素的指针,自动匹配compar要求的const void *参数类型。
  • 不需要写3个if语句判断比较字段
    比较逻辑已经完全封装在你传入的compar回调函数里了,要比较不同字段只需要单独实现对应的比较函数即可,areStudentsSorted函数内部不需要感知当前比较的是哪个字段,自然不需要额外分支。
  • 循环边界修复
    你原代码中for (int i = 0; i <= numelem; i++)会出现数组越界,正确的循环范围是i从0到numelem-2,也就是for (int i = 0; i < numelem - 1; i++),保证i+1最大为数组最后一个合法索引numelem-1。
  • 逻辑返回修复
    只要有一组相邻元素的比较结果>0,就直接返回false,全部遍历完无异常才返回true。

修复后的完整代码

bool areStudentsSorted(Student * stu, int numelem, int (*compar)(const void *, const void *)) {
    // 空数组或仅1个元素默认已排序
    if (numelem <= 1) {
        return true;
    }
    for (int i = 0; i < numelem - 1; i++) {
        // 传入相邻两个元素的指针给比较函数
        if (compar(&stu[i], &stu[i+1]) > 0) {
            // 出现逆序直接返回false
            return false;
        }
    }
    // 全部元素符合排序要求返回true
    return true;
}

如果需要比较ID字段,只需要额外实现对应的比较函数即可,不需要修改areStudentsSorted的内部逻辑:

int compareID(const void * p1, const void * p2){
    const Student *stu1 = p1;
    const Student *stu2 = p2;
    return stu1->ID - stu2->ID;
}

调用时直接传入对应函数指针即可:

if (!areStudentsSorted(stu, numelem, compareID)) {          
    return EXIT_FAILURE;      
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:48:03