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

读取文本文件到动态数组代码异常:输出乱码问题求助

代码错误分析与修复

核心问题与解决要点

  • 路径转义错误:Windows路径中的反斜杠\需转义为\\,否则编译器会将\U、\C等解析为无效转义序列,导致文件路径识别失败。原路径应修改为"C:\\Users\\varga\\CLionProjects\\untitled3\\subor.txt"。
  • 文件打开失败未终止程序:fopen返回NULL时,仅打印错误却继续执行后续代码,会触发空指针操作的未定义行为。需在打印错误后调用exit(EXIT_FAILURE)终止程序。
  • 字符统计逻辑错误:第一个循环中,每次getc读取字符后又调用fgetc,相当于跳过一个字符,导致统计的total仅为实际字符数的一半,同时丢失大量内容。需删除多余的fgetc(file),直接对读取到的字符计数。
  • 内容读取逻辑错误:第二个循环同样重复读取,getc判断EOF后用fgetc读取下一个字符存入数组,最终数组只存储原文件中每隔一个的字符,造成内容混乱。应直接将getc读取的字符存入数组。
  • 字符串结束符错误:string[index - 1] = "\0";中,"\0"是字符串指针,不能赋值给char变量,需改用字符常量'\0'。同时malloc需分配total + 1字节空间(预留结束符位置),避免越界写入。
  • getc返回值类型错误:getc返回值为int类型(包含EOF的-1值),用char存储会导致ASCII值为0xFF的字符被误判为EOF,提前终止读取。需将c的类型改为int。

修正后的代码

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

int main()
{
    FILE* file = fopen("C:\\Users\\varga\\CLionProjects\\untitled3\\subor.txt", "r");
    if (file == NULL)
    {
        printf("Error opening file\n");
        exit(EXIT_FAILURE);
    }

    size_t total = 0;
    int c;
    while ((c = getc(file)) != EOF)
    {
        total++;
    }

    char *string = malloc(total + 1);
    if (string == NULL) {
        printf("Memory allocation failed\n");
        fclose(file);
        exit(EXIT_FAILURE);
    }

    rewind(file);
    size_t index = 0;

    while ((c = getc(file)) != EOF)
    {
        string[index] = (char)c;
        index++;
    }

    string[index] = '\0';

    fclose(file);

    printf("File contents: \n\n");
    printf("%s\n", string);

    free(string);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:35:24