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

