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

C语言读取文件至二维数组时出现乱码(垃圾值)的问题排查与解决

解决C语言二维数组存储字符串乱码问题

嘿,我一眼就瞅出来你遇到的是C语言字符串处理里的经典小坑,咱们一步步把它搞定:

问题根源

  1. 缺少字符串结束符:你把token里的字符逐个复制到multiar[i]时,没给每个字符串加上'\0'(空字符)。C语言里字符串必须靠这个标记结尾,不然printf会一直读内存里的垃圾数据,直到碰巧碰到一个'\0',这就是乱码的罪魁祸首。
  2. 打印范围超出实际内容:你循环打印了30行30列,但你的文件里实际只有9个有效字段(3首歌×3个信息项),剩下的行都是未初始化的数组内存,全是随机垃圾值。

修改后的代码

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

int main(){
    char str[255];
    char* token;
    char multiar[50][50];
    FILE *fptr;
    
    // 先检查文件是否成功打开,避免空指针崩溃
    fptr = fopen("file.text" ,"r");
    if (fptr == NULL) {
        printf("无法打开目标文件!\n");
        return 1;
    }
    
    fgets(str, sizeof(str), fptr); // 用sizeof替代硬编码,适配数组长度变化
    token = strtok(str, ",");
    int i = 0;
    
    while (token != NULL){
        // 用strcpy更简洁,它会自动把token的内容(包括结尾的'\0')复制过去
        strcpy(multiar[i], token);
        
        // 如果你坚持手动复制,一定要加这行:
        // int len = strlen(token);
        // for (int j=0;j<len;j++){
        //     multiar[i][j] = token[j];
        // }
        // multiar[i][len] = '\0'; // 关键:给字符串加结束符
        
        token = strtok(NULL,",");
        i++;
    }
    fclose(fptr); // 操作完文件记得关闭,释放系统资源

    // 只打印实际存储的i行,别碰空内存
    for (int s=0; s<i; s++){
        printf("%s\n", multiar[s]); // 直接用%s打印字符串,不用逐字符循环
        printf("-----\n");
    }
    return 0;
}

关键修改说明

  • 补全字符串结束符:要么用strcpy自动处理,要么手动复制后加'\0',这是解决乱码的核心。
  • 缩小打印范围:用实际存储的元素个数i作为循环上限,只打印有有效内容的行。
  • 增加文件校验:防止文件不存在时程序直接崩溃。
  • 关闭文件:养成良好的资源管理习惯,避免内存泄漏。

这样修改后,就能得到你想要的干净输出啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:52:39