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

顺序搜索(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:45:22