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

C语言按姓名排序后二分查找无法匹配目标学生记录问题求助

代码存在的问题及修正方案


问题列表

  • nameCmp函数逻辑错误:当两个学生姓氏相同、名字更大时,错误返回0而非1,会导致同姓氏的记录排序异常,也会影响匹配判断。
  • bSearch函数参数类型不匹配:调用compare时第一个参数传入的是char*类型的姓氏字符串,而compare要求的入参是Student*类型,直接访问结构体成员属于未定义行为,会读取到无效内存数据,比较结果完全错误。
  • bSearch函数查找逻辑写反:当比较结果大于0时,说明目标值比中间值大,应该调整下界low而非上界high。
  • bSearch函数无未匹配返回值:找不到目标记录时没有返回-1,返回值为随机垃圾值,无法正确触发未找到逻辑。
  • 额外注意:你搜索的姓氏拼写为Figeroa,而注释中目标人物姓氏为Figueroa,请确认和CSV文件中的实际拼写一致,避免拼写错误导致匹配失败。

修正后的核心代码

修正nameCmp函数
int nameCmp(Student* s1, Student* s2)
{
    int result1 = strcmp(s1->lastname, s2->lastname);
    if (result1 != 0)
        return result1;
    // 姓氏相同时再比较名字
    return strcmp(s1->firstname, s2->firstname);
}
修正bSearch函数
int bSearch(Student data[], int count, char targetLastName[], int (*compare)(Student*, Student*))
{
    int low = 0, high = count - 1;
    // 构造临时搜索对象,仅填充要匹配的姓氏
    Student key = {0};
    strcpy(key.lastname, targetLastName);
    while (low <= high)
    {
        int mid = (high + low) / 2;
        int cmp = compare(&key, &data[mid]);
        if (cmp == 0)
            return mid;
        if (cmp > 0)
            low = mid + 1; // 目标比中间值大,调整下界
        else
            high = mid - 1; // 目标比中间值小,调整上界
    }
    // 未找到返回-1
    return -1;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:36:03