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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:00:21