顺序搜索(Sequential Search)返回垃圾值:数组目标值首尾索引异常求助
问题排查与修复方案
先逐个拆解你代码里的问题:
1. introducirarray函数的核心问题
- 传值参数无法同步外部变量:
numbusca是按值传递的,函数里用scanf修改的只是局部副本,主函数里的目标值根本没更新,导致后续搜索用的是垃圾值。 - 数组输入逻辑错误:循环里的
i没有递增,所有输入的数都会覆盖到numeros[0],数组其他位置全是未初始化的垃圾值。 - 输入换行处理不当:
scanf("%c", &end)会读取输入数字后的换行或空格,导致循环提前终止,且未处理用户可能输入的空白字符。 - 未记录实际输入元素个数:默认遍历20个元素,但用户可能只输入了几个,剩下的元素是垃圾值,会干扰搜索结果。
2. buscador函数的问题
- 循环逻辑错误:do-while先执行循环体再判断,会跳过第一个元素的检查(第一次循环
indexprim=0,e变成1,然后判断numeros[1]),如果目标不在数组里,会一直越界访问,导致垃圾值输出。 - 未处理目标不存在的情况:如果数组里没有目标值,函数会无限循环或访问非法内存,行为不可控。
3. buscultima函数的问题
- 遍历范围错误:固定遍历20个元素,会碰到未初始化的垃圾值,如果垃圾值等于目标值,会错误更新
indexfin。 - 未处理目标不存在的情况:如果目标不存在,
indexfin会保持初始值0,这是错误的。
修复后的完整代码
#include <stdio.h> #include <ctype.h> // 修正:传递numbusca的指针,记录实际输入的元素个数 void introducirarray(int numeros[20], int *numbusca, int *cantidad) { printf("Por favor introduce el número a buscar: "); scanf("%i", numbusca); // 清除输入缓冲区的换行符 while (getchar() != '\n'); printf("Introduce los elementos del array (max 20, termina con enter):\n"); *cantidad = 0; char c; while (*cantidad < 20) { // 跳过空白字符(空格、制表符等) while ((c = getchar()) != EOF && isspace(c) && c != '\n'); if (c == '\n') break; // 把刚才读的字符放回去,用scanf读整数 ungetc(c, stdin); scanf("%i", &numeros[*cantidad]); (*cantidad)++; } } // 查找首次出现的索引,返回-1表示未找到 int buscador(int numeros[], int numbusca, int cantidad) { for (int e = 0; e < cantidad; e++) { if (numeros[e] == numbusca) { return e; } } return -1; // 未找到返回-1 } // 查找最后一次出现的索引,返回-1表示未找到 int buscultima(int numeros[], int numbusca, int cantidad) { int indexfin = -1; for (int o = 0; o < cantidad; o++) { if (numeros[o] == numbusca) { indexfin = o; } } return indexfin; } // 主函数示例 int main() { int numeros[20]; int numbusca, cantidad; introducirarray(numeros, &numbusca, &cantidad); int prim = buscador(numeros, numbusca, cantidad); if (prim != -1) { printf("La primera aparición del número deseado es %i\n", prim); } else { printf("El número no se encuentra en el array\n"); } int ult = buscultima(numeros, numbusca, cantidad); if (ult != -1) { printf("La última aparición del número deseado es %i\n", ult); } else { printf("El número no se encuentra en el array\n"); } return 0; }
修复说明
- 给
introducirarray添加了cantidad参数,记录用户实际输入的元素个数,避免遍历未初始化的垃圾值。 numbusca改为指针传递,确保主函数能拿到正确的目标值。- 优化了输入处理逻辑,跳过空白字符,正确终止数组输入。
- 搜索函数改为返回索引(未找到返回-1),主函数里处理输出,避免函数直接打印,增强复用性。
- 所有搜索都基于实际输入的元素个数,不会访问非法内存或垃圾值。
内容的提问来源于stack exchange,提问作者dza205
相关产品推荐
相关产品推荐

