使用fgetc(stdin)实现read_int时输入整数仍触发错误的原因咨询
问题分析与修复方案
你的read_int函数有几个关键问题导致它无法正确识别整数输入,咱们一个个拆解来看:
1. 混淆了字符ASCII值和实际整数
fgetc(stdin)读取的是输入字符的ASCII码值,不是字符对应的整数。比如你输入5,fgetc返回的是ASCII码53,而不是整数5。直接返回这个值肯定不是你想要的结果。
2. 多余的fgetc调用导致错误触发
你的代码里先读了一个字符到f,紧接着又调用了一次fgetc(stdin)来判断是否是EOF——这会跳过输入的下一个字符(比如你输入整数后按回车,第二次fgetc会读到换行符\n,它不等于EOF,所以直接触发错误提示退出程序)。这就是为啥你每次输入都会报错的核心原因。
3. 不支持多位数整数
当前代码只能处理单个字符,完全没法读取123这类多位数的整数,这显然不符合需求。
修复后的read_int实现
下面是一个修正后的版本,能正确处理整数输入(包括多位数、正负号),同时做基本的错误检查:
#include <stdio.h> #include <stdlib.h> #include <ctype.h> int read_int(void) { int result = 0; int sign = 1; int c; // 跳过开头的空白字符(空格、换行等) while ((c = fgetc(stdin)) != EOF && isspace(c)) { ; } // 处理正负号 if (c == '-' || c == '+') { sign = (c == '-') ? -1 : 1; c = fgetc(stdin); } // 读取数字字符并转换为整数 while (c != EOF && isdigit(c)) { result = result * 10 + (c - '0'); // 把ASCII码转成实际数字 c = fgetc(stdin); } // 如果没有读到有效数字,触发错误 if (!isdigit(c) && !(isspace(c) || c == EOF)) { printf("Sorry that is invalid.\n"); exit(1); } // 把多余的字符放回输入流(避免影响后续read_double读取) if (c != EOF) { ungetc(c, stdin); } return result * sign; }
修复说明
- 先跳过输入开头的空白字符,处理用户可能输入的空格或换行;
- 支持正负号的识别;
- 通过
c - '0'把字符的ASCII码转换为对应的整数数值; - 正确处理多位数,通过
result * 10 + 新数字累加得到完整整数; - 错误检查逻辑更合理:只有当遇到非数字、非空白的字符时才判定为无效输入;
- 把未处理的字符放回输入流,避免影响后续的
read_double函数读取。
你可以把这个修正后的read_int替换掉原来的版本,再测试看看,应该就能正常工作了。
内容的提问来源于stack exchange,提问作者Elo
相关产品推荐
相关产品推荐

