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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:59:25