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

二维Char数组构建迷宫时列索引越界问题求助(附代码)

解决读取迷宫文件时的列越界问题

嗨,作为编程新手遇到这种循环逻辑的问题太正常了,我帮你一步步梳理清楚问题所在,再给你修复后的代码~

问题出在哪?

咱们先拆解下代码里的几个关键bug:

  • 循环嵌套逻辑混乱:你外层用了while(input.get(data)),里面又套了for(rows)和while(data != '\n'),多次调用input.get()会让读取流程乱掉,columns没法在正确时机重置,甚至会跳过换行符或重复读取,最终导致列数超出范围。
  • 边界判断错误:数组下标从0开始,你的迷宫数组是char maze[SIZE][SIZE],合法列范围是0到29(SIZE=30)。原来的columns > SIZE判断要等列数到30才触发提示,这时候已经越界了,应该改成columns >= SIZE。
  • 迷宫输出方式错误:cout << maze << endl;只会输出数组的内存地址,根本打不出迷宫内容,得用循环逐行逐列打印。
  • 固定行数循环不合理:你写了for (int rows = 0; rows < 20; rows++),但SIZE是30,而且你预期的迷宫只有3行,固定20行容易多读或少读。

修复后的代码

#include<fstream>
#include<iostream>
#include<string>
#include <vector>
//Maze Size
#define SIZE 30
using namespace std;
void readMaze(string fileName);
void inputMaze();
int main() {
    inputMaze();
}
void readMaze(string fileName) {
    int rows = 0; // 把rows定义在外面,跟踪当前读取的行数
    char maze[SIZE][SIZE];
    ifstream input(fileName);
    
    // 逐行读取,直到文件结束或者行数超过SIZE
    string line;
    while (getline(input, line) && rows < SIZE) {
        int columns = 0;
        // 遍历当前行的每个字符
        for (char c : line) {
            if (columns >= SIZE) { // 提前判断,避免越界
                cout << "COLUMNS GREATER THAN SIZE";
                break;
            }
            maze[rows][columns] = c;
            columns++;
        }
        rows++;
    }

    // 打印迷宫内容
    cout << "The Maze being solved is: " << endl;
    for (int i = 0; i < rows; i++) { // 只打印实际读取的行数
        for (int j = 0; j < SIZE; j++) {
            // 这里可以优化:如果当前位置没被赋值,打印空格或者跳过
            cout << maze[i][j];
        }
        cout << endl; // 每行结束换行
    }

    input.close();
}
void inputMaze() {
    string userinput;
    cout << "Please input a .txt file name" << endl; // 修正拼写错误Plese→Please
    cin >> userinput;
    readMaze(userinput);
}

关键修改点说明

  1. 改用逐行读取:用getline(input, line)直接读取每一行,逻辑更清晰,不用手动处理换行符,避免了多次调用input.get()的混乱。
  2. 正确重置columns:每读取一行就把columns重置为0,再遍历该行字符赋值给迷宫数组,保证每一行的列数从0开始计数。
  3. 修正边界判断:把columns > SIZE改成columns >= SIZE,在列数即将越界时就触发提示,提前避免错误。
  4. 正确打印迷宫:用两层循环逐个打印字符,外层遍历行数,内层遍历列数,这样就能输出你预期的迷宫样式了。
  5. 小细节修正:把输入提示里的Plese改成Please,更规范~

额外小提示

如果你想更灵活地处理迷宫大小,也可以用vector<vector<char>>代替固定大小的数组,这样就不用受SIZE的限制啦,不过作为新手,先把固定数组的逻辑搞懂就好~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:38:51