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

