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

