C语言使用scanf做整数输入验证时出现无限循环问题如何解决?
问题根因
scanf匹配失败时,输入的非法内容不会被消耗,会一直滞留在标准输入缓冲区中:
- 当用户输入非数字内容时,
%u格式匹配失败,scanf返回0进入错误分支 - 下一次循环运行
scanf时,会直接读取缓冲区里的残留非法内容,再次匹配失败,最终形成无限死循环,不会等待新的用户输入。
另外你当前代码还存在类型不匹配的隐患:变量hours是int有符号整型,但你用了%u无符号整型格式符,输入负数时会出现异常结果。
修复方案
在错误分支中增加输入缓冲区清空逻辑,把残留的非法内容全部清理后再进入下一次循环,修复后的完整代码如下:
// 统一变量和格式符类型,避免类型不匹配 unsigned int hours; // get input while(1) { printf("How Many Hours You Worked This Week: "); if(scanf("%u", &hours)) break; else { printf("oops, Write Integers Only not string or chars\n"); // 清空输入缓冲区残留内容,直到读完换行符或输入流结束 while(getchar() != '\n' && getchar() != EOF); } }
补充说明
- 缓冲区清空逻辑会逐个读取输入缓冲区中的字符,直到遇到换行符(用户单次输入的结束标志)或输入流结束,确保下一次
scanf触发时没有残留内容,会正常等待用户输入新内容。 - 如果你需要支持负数时长的异常校验,可把变量改成
int hours,格式符同步改成%d即可。
内容的提问来源于stack exchange,提问作者Omar Azzam
相关产品推荐
相关产品推荐

