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

C语言getchar读取输入流结束标记问题求助

问题分析与解决方案

核心问题

  1. 输入流EOF状态无法重置:第一次调用getchar()直到EOF后,标准输入流的EOF标志被置位,后续getchar()会直接返回EOF,无法再读取输入内容。
  2. 宏定义错误:#define MAX_LEN len是无效用法——宏在预编译阶段处理,此时运行时变量len还未初始化,预编译器无法识别该值,属于语法错误(部分编译器可能兼容,但不符合C标准)。
  3. 冗余的两次读取:先读一遍统计长度再读一遍存储字符的逻辑完全没必要,既浪费资源又引发输入流问题。

修正方案

直接在第一次读取时就将字符存储到动态分配的数组中(避免变长数组的栈溢出风险,同时更灵活),彻底消除两次读取输入流的问题,同时修复宏定义的错误用法。

修正后的代码

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int c;
    int len = 0;
    // 预分配初始空间,可根据需求调整
    char *str = malloc(100 * sizeof(char));
    if (str == NULL) {
        perror("malloc failed");
        return 1;
    }

    // 读取字符并存储,同时统计长度,遇到EOF停止
    while ((c = getchar()) != EOF) {
        // 空间不足时重新分配
        if (len >= 100) {
            char *temp = realloc(str, (len + 100) * sizeof(char));
            if (temp == NULL) {
                perror("realloc failed");
                free(str);
                return 1;
            }
            str = temp;
        }
        str[len++] = c;
    }

    // 添加字符串结束符
    str[len] = '\0';

    // 输出字符串
    int i = 0;
    while (str[i] != '\0') {
        putchar(str[i++]);
    }

    // 释放动态分配的内存
    free(str);
    return 0;
}

针对原逻辑的临时修复(不推荐,仅作演示)

如果一定要保留两次读取的逻辑,需要在第一次读取后重置输入流的EOF标志,但这种方法依赖平台,兼容性差:

#include <stdio.h>

int main(void) {
    int c, len = 0;

    // 第一次读取统计长度
    while ((c = getchar()) != EOF) {
        len++;
    }

    // 重置输入流(Linux/macOS下有效,Windows部分环境需用rewind(stdin))
    clearerr(stdin);

    // 直接用len定义变长数组,去掉错误的宏定义
    char str[len];
    int i = 0;

    // 第二次读取(仅部分环境下有效)
    while ((c = getchar()) != EOF && i < len - 1) {
        str[i++] = c;
    }

    str[i] = '\0';

    // 输出
    i = 0;
    while (str[i] != '\0') {
        putchar(str[i++]);
    }

    return 0;
}

关键说明

  • 动态数组优势:避免变长数组的栈溢出风险(输入内容过长时,栈空间不足会导致程序崩溃),同时更符合C语言内存管理规范。
  • EOF输入方式:Windows终端下按Ctrl+Z(需单独一行输入,或在输入末尾触发),Linux/macOS下按Ctrl+D触发EOF。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:45:41