#c #arrays #multidimensional-array
#c #массивы #многомерный массив
Вопрос:
Я пытаюсь отобразить сетку судоку, используя 2D-массив на C . Я тестировал код, сравнивая входные данные с «дампом» 2d-массива. Массив имеет размер 9×9. Моя проблема в том, что все первые 8 столбцов идеальны. Но последний столбец кажется неправильным в восьми из 9 случаев. Почему это может быть?
код:
#include <iostream>
#include <fstream>
#include <string>
int i = 0;
int j = 0;
const char test[12] = {'e', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*'};
std::string abc = "";
// Class to map out a sudoku grid
class grid {
public:
char board[8][8];
void mapChars(std::string fileName) {
int x = 0;
int y = 0;
std::string line;
std::ifstream myfile (fileName.c_str());
if (myfile.is_open()) {
while (getline(myfile,line)) {
for(std::string::size_type i = 0; i < line.size(); i) {
if(strchr(test, line[i]) != NULL){
if (line[i] == 'e') {
y ; x=0;
} else {
board[y][x] = line[i];
x ;
}
}
}
} myfile.close();
}
}
void dumpMap() {
while(j < 9){
while(i < 9){
std::cout << board[j][i] << ' ';
i;
}
std::cout << std::endl;
j;
i = 0;
}
}
} sudoku;
int main() {
sudoku.mapChars("easy1.map");
sudoku.dumpMap();
std::cin >> abc;
return 0;
}
Комментарии:
1. Разве доска судоку не должна определяться
9x9
массивом?2. «массив имеет размер 9×9» Или НЕТ?
3. как объясняет @wolfPack88, я запутался между объявлением и индексацией
Ответ №1:
Здесь вы объявляете массив размером 8 на 8: char board[8][8]
. Если вы хотите, чтобы оно было 9 на 9, используйте char board[9][9]
. Я предполагаю, что вы перепутали объявление с индексацией. При объявлении char board[8][8]
board
имеет первый индекс, который начинается с 0..7 и аналогичного второго индекса.
Причина, по которой вы получаете вывод значения вместо ошибки, заключается в том, что вывод и индексирование доступа вне границ не определены. Когда ваш код пытается получить доступ board[i][j]
, исполняемый файл использует значения, которые вы ему дали, i
и j
определяет, из какой части памяти он должен извлекать данные. Если i
и j
находятся за пределами, ваш исполняемый файл выводит память, с которой board
на самом деле вообще не связан, и фактически является мусорными значениями, с которыми вы столкнулись.
Комментарии:
1. Ах… Такая ошибка новичка. Так почему же он фактически вернул значение?
2. Это неопределенное поведение. Я отредактирую свой ответ, чтобы объяснить это немного подробнее.