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

从文件读取一行至char数组并遇换行终止的程序问题求助

问题分析与修复方案

嘿,我看看你的代码问题出在哪——你现在的逻辑确实有几个明显的漏洞,导致没拿到预期的"Hello",反而只输出了"llo"和乱码。咱们一步步理清楚:

1. 第一个字符被直接丢弃了

你外层的while循环先用fgetc(fp)读了文件的第一个字符'H',但这个字符根本没存到数组里,直接就进入内层for循环了。紧接着在for里又用fscanf读下一个字符'e',等于直接把'H'扔了,这就是为什么输出少了前两个字符的原因。

2. 字符串没加终止符\0

C语言里的字符串必须以\0结尾才能被printf("%s")正确识别,你只往数组里塞了读取到的字符,没加这个终止符,所以printf会一直读到数组里的随机垃圾内容,就出现了无效字符。

3. 嵌套循环完全没必要

外层while和内层for的嵌套把读取逻辑搞乱了,重复读取字符不说,还容易出现逻辑冲突,其实一个循环就能搞定读取到换行符的需求。


修复后的代码

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

int main() {
    char random[100];
    FILE *fp = fopen("testing.txt", "r");
    
    if (fp == NULL) {
        printf("Can't open the file\n");
        exit(1);
    }

    int i = 0;
    char c;
    // 读取字符,直到碰到换行符或者文件结束
    while ((c = fgetc(fp)) != EOF && c != '\n') {
        // 加个判断防止数组溢出,更安全
        if (i < 99) {  // 留一个位置给终止符'\0'
            random[i++] = c;
        } else {
            break; // 数组满了就停,避免越界
        }
    }
    // 一定要加字符串终止符!
    random[i] = '\0';

    printf("%s\n", random);
    fclose(fp); // 原代码没关文件,补上避免资源泄漏
    return 0;
}

关键改进说明

  • 修复读取逻辑:用单个while循环控制读取,每读一个字符就判断是否是换行符/EOF,符合条件就存入数组,不会再丢失第一个字符。
  • 添加终止符:读取完成后给数组最后一个位置赋值'\0',保证printf能正确识别字符串边界。
  • 越界保护:加入i < 99的判断,防止文件内容过长导致数组溢出,这是个很重要的安全习惯。
  • 关闭文件:原代码漏了fclose(fp),会导致文件资源无法及时释放,现在补上了。

如果你的需求其实是只读取到空格前的"Hello"(而不是整行),那只需要把循环条件里的c != '\n'改成c != '\n' && c != ' '就行,这样读到空格就会停止,正好存入"Hello"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:13:52