为何这段采用do-while循环的linear search代码无法输出正确结果?
问题分析与修复
你的代码存在多个关键错误,直接导致结果异常甚至程序行为不可控:
核心错误点
- 变量初始化错误:
i == 0是比较运算符而非赋值,这会让i成为随机垃圾值,直接触发数组越界访问,出现莫名其妙的数字或无输出。应改为i = 0。 - 循环条件逻辑完全错误:do-while的终止逻辑写反了,你用了
||,实际应该用&&——只有当当前元素不等于目标值且未遍历完数组时,才继续循环。原条件会导致要么无限循环,要么提前跳出遍历。 - 数组越界访问:数组索引范围是
0~9(10个元素),原代码的n > i(n=10)会允许i走到10,此时访问t[10]属于越界,触发未定义行为。 - 函数返回值缺失:
search声明为int类型,但无任何return语句,这会导致程序行为不可预测。 - 索引输出偏差:若你要的是数组实际索引(从0开始),原代码的
i+1会多1;若要从1开始的位置,需明确和预期对应。
修复后的代码
使用while循环版本
#include <stdio.h> // 搜索成功返回索引,失败返回-1 int search(int t[], int x, int n) { int i = 0; // 正确初始化 while (i < n && t[i] != x) { i++; } if (i < n) { printf("找到目标,索引=%d(位置=%d)\n", i, i+1); return i; // 返回索引供调用者使用 } else { printf("未找到目标元素\n"); return -1; } } int main() { int t[10]; int x, i; printf("请输入要查找的数字x: "); scanf("%d", &x); printf("请输入10个数组元素:\n"); for (i = 0; i < 10; i++) { printf("元素%d: ", i); scanf("%d", &t[i]); } search(t, x, 10); return 0; }
强制要求的do-while循环版本
#include <stdio.h> int search(int t[], int x, int n) { int i = 0; do { if (t[i] == x) { printf("找到目标,索引=%d(位置=%d)\n", i, i+1); return i; } i++; } while (i < n); printf("未找到目标元素\n"); return -1; } // main函数同上面的版本,省略重复代码
修复说明
- 确保遍历范围严格限制在
0~9,避免越界 - 明确函数返回值,方便后续扩展使用
- 同时输出数组索引(从0开始)和直观位置(从1开始),适配不同需求
- 消除所有未定义行为,结果稳定可控
内容的提问来源于stack exchange,提问作者salim
相关产品推荐
相关产品推荐

