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

C语言编程:if语句中断循环后如何重新获取scanf的新输入

问题原因
  • scanf匹配失败时,输入的非法字符会残留在标准输入缓冲区中,下次循环执行scanf时会直接读取该残留字符,永远匹配失败,进而触发死循环。
  • 你当前的逻辑使用goto TAG会直接重置输入流程,之前已经输入正确的数值会全部作废,不符合常见的输入校验需求(仅重输错误项即可)。
  • 额外语法隐患:你的代码外层重复定义了double i,和for循环内的int i命名冲突,属于冗余无效定义,可以直接删除。
修复方案

方案1:仅重输错误项(推荐)

不需要跳转回开头重新输全部5个数字,输入非法后清空缓冲区、提示后直接重新输入当前项即可,代码如下:

int main(){
    const int ARRAYSIZE = 5;
    double array1[ARRAYSIZE];
    double array2[ARRAYSIZE];

    printf("Input a total of %d numbers.\n", ARRAYSIZE);
    printf("The numbers will be accumulated:\n");
    fflush(stdout);

    for(int i = 0; i < ARRAYSIZE;  i++){
        if(scanf("%lf", &array1[i]) != 1)
        {
            printf("That is not a number - try again\n");
            // 清空输入缓冲区残留的非法字符
            while(getchar() != '\n');
            // 回退i,下次循环重新输入当前下标的值
            i--;
            continue;
        }
    }
    // 后续累加、输出逻辑写在此处
    return 0;
}

方案2:保留goto跳转重头输入的逻辑

如果你确实需要输入出错后重新从第一个数开始输入,只需要在跳转前清空输入缓冲区即可,对应代码修改部分如下:

if(scanf("%lf", &array1[i]) != 1)
{
    printf("That is not a number - try again\n");
    // 先清空输入缓冲区残留的无效字符
    while(getchar() != '\n');
    goto TAG;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:06:05