C语言while循环中使用scanf输入字母部分正常其余触发无限循环问题
问题原因
scanf匹配数字失败时,输入的非法字符不会被从输入缓冲区中移除,下一次循环scanf会重复读取同一个非法字符,持续匹配失败,最终进入无限循环的报错状态。你观察到输入部分字母可正常运行属于特殊测试场景下的巧合,代码本身的逻辑存在通用缺陷。
修复方案
匹配失败后先清空输入缓冲区的残留内容,再引导用户重新输入即可,修复后的完整代码如下:
#include <stdio.h> int main(void) { char loop_flag = 't'; double input_num; while (loop_flag == 't') { printf("请输入数字\n"); if (scanf(" %lf", &input_num)) { loop_flag = 'f'; } else { printf("该操作不被允许,请重新尝试输入\n"); // 清空输入缓冲区残留的非法字符 while (getchar() != '\n'); } } printf("你输入的数字是%lf", input_num); return 0; }
逻辑说明
- 新增的
while(getchar() != '\n');会逐字符读取输入缓冲区中的内容,直到读完换行符为止,将之前输入的所有非法字符全部丢弃,确保下一次scanf可以读取到用户新输入的内容。 - 如果你的使用场景需要兼容管道输入等可能出现输入结束(EOF)的情况,可以将清空缓冲区的逻辑修改为
while(getchar() != '\n' && !feof(stdin));避免极端场景下的死循环。
内容的提问来源于stack exchange,提问作者Alexander Wester
相关产品推荐
相关产品推荐

