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

C语言while循环中计数器自动重置导致死循环问题求助

问题原因分析
  1. 类型不匹配引发内存覆盖
    代码中ab是unsigned char类型数组,每个元素仅占1字节,但scanf使用%d格式符——该格式符要求传入int*类型指针,用于存储4字节整数(x86_64架构下int占4字节)。当scanf向&ab[i]写入4字节数据时,会超出ab[i]的内存范围,覆盖数组后方的内存空间。而变量i的内存位置恰好紧跟在ab数组之后,写入的数据会直接修改i的值,导致计数器被重置,循环无限执行。

  2. fflush(stdin)属于未定义行为
    C标准明确规定fflush仅对输出流有效,对输入流调用fflush的行为无统一定义,不同编译器处理逻辑不一致,可能引发不可预料的错误。

解决办法
  1. 修正scanf格式符匹配类型
    使用%hhu格式符对应unsigned char类型,确保写入数据的大小与目标变量一致:

    int i;
    unsigned char ab[7];
    printf("Enter numbers : ");
    i=0;
    while(i<7)
    {
        scanf(" %hhu",&ab[i]);
        // 替换fflush(stdin)的缓冲区清理代码
        int c;
        while ((c = getchar()) != '\n' && c != EOF);
        i++;
        printf("\nvalue of i : %d",i);
    }
    
  2. 替换fflush(stdin)清理输入缓冲区
    用循环读取输入缓冲区残留字符,直到遇到换行符或EOF,避免残留输入影响后续读取:

    int c;
    while ((c = getchar()) != '\n' && c != EOF);
    
  3. 可选:先读入int变量再转换存储
    如果需要输入的整数范围超出unsigned char的0-255区间,可先读取到int变量,校验合法性后再转换存入数组:

    int i, temp;
    unsigned char ab[7];
    printf("Enter numbers : ");
    i=0;
    while(i<7)
    {
        scanf(" %d",&temp);
        // 清理缓冲区
        int c;
        while ((c = getchar()) != '\n' && c != EOF);
        // 校验输入范围
        if(temp >=0 && temp <=255){
            ab[i] = (unsigned char)temp;
            i++;
            printf("\nvalue of i : %d",i);
        } else {
            printf("\nInput out of range, please enter 0-255");
        }
    }
    

内容的提问来源于stack exchange,提问作者Chetan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:15:33