C语言读取文件至二维数组时出现乱码(垃圾值)的问题排查与解决
解决C语言二维数组存储字符串乱码问题
嘿,我一眼就瞅出来你遇到的是C语言字符串处理里的经典小坑,咱们一步步把它搞定:
问题根源
- 缺少字符串结束符:你把
token里的字符逐个复制到multiar[i]时,没给每个字符串加上'\0'(空字符)。C语言里字符串必须靠这个标记结尾,不然printf会一直读内存里的垃圾数据,直到碰巧碰到一个'\0',这就是乱码的罪魁祸首。 - 打印范围超出实际内容:你循环打印了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
相关产品推荐
相关产品推荐

