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

使用ferror测试scanf输入时无法识别错误的问题求解

问题原因

ferror(stdin) 用于检测标准输入流的底层读写错误(比如流损坏、对只读流执行写操作等),无法检测 scanf 输入格式不匹配的场景:

  • 输入字符串给 %d 格式的 scanf 属于格式匹配失败,不属于流读写错误,因此 ferror 始终返回假,不会触发错误提示。
  • scanf 的返回值才是判断输入是否合法的依据:它会返回成功匹配并赋值的输入项数量,匹配失败时返回0,读到输入末尾时返回EOF(即-1),原有代码没有判断这个返回值,自然无法识别格式错误。

修正后的代码

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

int main(void)
{
    int i;
    // 判断scanf返回值是否等于预期要读取的变量个数(这里是1)
    if(scanf("%d",&i) != 1) {
        printf("输入错误!请输入整数");
        // 可选:清空输入缓冲区残留的错误数据,避免后续输入被污染
        while(getchar() != '\n');
    } else {
        printf("输入的整数是:%d", i);
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:15:04