C语言使用ncurses.h从文件加载二维char数组并用mvprintw()打印问题
问题根源与修复方案
核心问题
你读取地图文件时没有处理每行末尾的换行符:文本文件中每行30个地图字符后会存在换行标记(Windows系统为\r\n,类Unix系统为\n),你当前的双层循环每轮固定读取30个字符才切换行,会把上一行的换行符作为下一行的首个元素存入地图数组,导致所有内容逐行偏移错位。
其他可优化点
- 读取文件仅需只读权限,不用开
r+读写模式,改为r更合理 - 建议增加文件打开失败的判空逻辑,避免文件不存在时程序崩溃
修复代码
读取部分修改:
mapfile = fopen(mapname, "r"); // 新增文件判空逻辑 if (mapfile == NULL) { return; } for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { char c = fgetc(mapfile); // 跳过所有换行/回车符,只读取有效地图字符 while (c == '\n' || c == '\r') { c = fgetc(mapfile); } map[row][col] = c; } // 读完当前行所有有效字符后,丢弃剩余的换行标记 int skip; while((skip = fgetc(mapfile)) != '\n' && skip != EOF); } fclose(mapfile);
打印部分验证
当前打印逻辑的规则本身没问题,读取逻辑修复后,点号替换为空格、不同字符对应不同颜色的效果都会正常显示。
内容的提问来源于stack exchange,提问作者Jakub Kolesár
相关产品推荐
相关产品推荐

