非递归二分查找输出异常问题求助(附C语言实现代码)
非递归二分查找记录输出错误排查指南
核心排查方向
- 目标匹配后的索引访问错误:确认找到目标时,
mid值的使用是否正确,是否混淆了数组下标与记录的字段值(比如误将下标当作记录ID输出)。 - 结构体成员访问错误:如果数组存储的是结构体,检查输出语句是否正确访问了结构体的成员变量,比如是否写成
records[mid]而非records[mid].target_field。 - 二分边界条件错误:验证
low和high的初始值(应为0和n-1,而非n),循环终止条件是否为low <= high,避免漏掉中间匹配的元素。 - 关键字段比较逻辑错误:确认比较时是用记录的关键字段(如ID)和目标值对比,而非直接用结构体本身进行比较。
- 输出格式符不匹配:如果用
printf输出,格式符必须和变量类型对应,比如整型用%d、字符串用%s,类型不匹配会导致乱码或错误值。
错误示例与修复参考
假设你的记录结构体定义如下:
typedef struct { int id; char name[20]; } Record;
常见错误代码
// 错误点:high初始值错误、循环条件错误、输出未访问结构体成员 int binarySearch(Record records[], int n, int target) { int low = 0, high = n; while (low < high) { int mid = (low + high) / 2; if (records[mid].id == target) { printf("找到记录:%p\n", records[mid]); // 错误:直接输出结构体地址而非成员 return mid; } else if (records[mid].id < target) { low = mid + 1; } else { high = mid - 1; } } return -1; }
修复后的正确代码
int binarySearch(Record records[], int n, int target) { int low = 0, high = n - 1; while (low <= high) { int mid = low + (high - low) / 2; // 避免(low+high)数值溢出 if (records[mid].id == target) { printf("找到记录:ID=%d,姓名=%s\n", records[mid].id, records[mid].name); return mid; } else if (records[mid].id < target) { low = mid + 1; } else { high = mid - 1; } } printf("未找到目标记录\n"); return -1; }
请贴出你的完整代码,重点核对上述几个排查点——尤其是匹配后的索引访问和成员输出逻辑,这是此类问题的高发区域。
内容的提问来源于stack exchange,提问作者Leonardo Alberto Alvarado Agui
相关产品推荐
相关产品推荐

