二维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); }
关键修改点说明
- 改用逐行读取:用
getline(input, line)直接读取每一行,逻辑更清晰,不用手动处理换行符,避免了多次调用input.get()的混乱。 - 正确重置columns:每读取一行就把
columns重置为0,再遍历该行字符赋值给迷宫数组,保证每一行的列数从0开始计数。 - 修正边界判断:把
columns > SIZE改成columns >= SIZE,在列数即将越界时就触发提示,提前避免错误。 - 正确打印迷宫:用两层循环逐个打印字符,外层遍历行数,内层遍历列数,这样就能输出你预期的迷宫样式了。
- 小细节修正:把输入提示里的
Plese改成Please,更规范~
额外小提示
如果你想更灵活地处理迷宫大小,也可以用vector<vector<char>>代替固定大小的数组,这样就不用受SIZE的限制啦,不过作为新手,先把固定数组的逻辑搞懂就好~
内容的提问来源于stack exchange,提问作者interben1234
相关产品推荐
相关产品推荐

