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
相关产品推荐
相关产品推荐

