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

使用fgets从stdin读取多行并追加存储到字符数组的实现问题

问题原因

你现在的写法每次调用fgets时都是从line数组的首地址开始写入,所以新读到的内容会直接覆盖之前存储的内容,循环结束后自然只剩下最后一行的内容。

修复实现方案

你需要额外维护一个偏移量,记录当前数组中已有内容的末尾位置,每次读新行时往偏移后的地址写入即可,同时要注意不要超过数组的总容量,避免越界。

#include <stdio.h>
#include <string.h>

int main() {
    char line[150] = {0}; // 初始化数组全为0,保证字符串始终有合法结束符
    int offset = 0; // 记录当前写入的起始偏移位置
    // 每次读取的目标地址是line+offset,长度参数为剩余可用空间
    while (fgets(line + offset, sizeof(line) - offset, stdin) != NULL) {
        // 追加完一行后,更新偏移量为当前字符串总长度
        offset = strlen(line);
        // 剩余空间不足时提前退出,避免越界
        if (sizeof(line) - offset <= 1) {
            break;
        }
    }
    printf("%s", line);
    return 0;
}

补充说明

  • 如果需要存储的内容总长度超过150字节,可以改用动态内存分配(malloc/realloc)的方式扩容数组,不受固定长度限制。
  • 若输入行长度超过你给fgets设置的读取长度,fgets会分多次读完一整行,上述代码的拼接逻辑依然适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:05