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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:18:02