C语言读取文件后无法正确打印10x10 Sokoban网格的问题排查
推箱子地图读取打印问题分析与解决
问题原因
你使用fscanf("%c", ...)读取字符时,会将文本文件中的换行符(\n)当作普通字符读入数组。目标地图每行是10个有效字符,但实际文本文件中每行末尾存在换行符(Windows系统下可能是\r\n),你的读取循环仅按每行10个字符读取,导致换行符被混入grid数组的后续行开头,最终所有内容错位,打印格式混乱。
解决方案
提供三种可行的修复方式,任选其一即可:
方法1:读取每行后跳过换行符
在每行读取完10个字符后,用fgetc吃掉行尾的换行符:
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { fscanf(file, "%c", &m.grid[i][j]); } // 跳过当前行末尾的换行符(兼容Windows的\r\n) fgetc(file); // 如果是Windows系统,若读取到\r则需再处理一次: // char c = fgetc(file); // if (c != '\n') ungetc(c, file); }
方法2:用fgets读取整行再截取
fgets可以一次性读取整行,再将前10个有效字符复制到grid中,避免换行符干扰:
char buffer[12]; // 预留足够空间容纳整行内容 for (int i = 0; i < 10; i++) { fgets(buffer, sizeof(buffer), file); // 复制每行前10个字符到grid对应行 strncpy(m.grid[i], buffer, 10); }
方法3:通过fscanf的格式符跳过空白字符
在%c前加空格,让fscanf自动跳过所有空白字符(包括换行、空格),精准读取100个有效字符:
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { // 格式串前的空格会跳过所有空白字符 fscanf(file, " %c", &m.grid[i][j]); } }
修改后,你的drawMap函数逻辑正确,每行打印10个字符后换行,即可输出符合预期的地图。
内容的提问来源于stack exchange,提问作者RealBluenerve
相关产品推荐
相关产品推荐

