我知道这意味着尝试访问受限内存时出现问题,但我不知道如何找到错误发生的位置或如何修复它。一个小小的解释会很有帮助。
int main(int argc, char* argv[1]) {
char emptyBoard[3][3];
char player;
int row, column; // moves
int i, j;
// int x = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
emptyBoard[i][j] = '.';
}
}
/*
for(i = 0; i < 3; i++){
for (j = 0; j < 3; j++){
printf("%c ", emptyBoard[i][j]);
}
printf("\n");
}
*/
FILE* filePtr = fopen(argv[1], "r");
if (filePtr == NULL) {
printf("Cannot open File \n");
return 1;
}
while (fscanf(filePtr, "%c, %d, %d", &player, &row, &column) != EOF) {
// moves = x++;
emptyBoard[row][column] = player;
printBoard(emptyBoard);
}
// printf("Total Moves: %d", moves );
fclose(filePtr);
}
void printBoard() {
int i, j;
char array[3][3];
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("%c ", array[i][j]);
}
printf("\n");
}
}
答案 0 :(得分:0)
如果输入文件中的行或列 >= 3,程序会崩溃。
fscanf 条件不足以终止循环,要么检查已处理的记录数,要么添加空间,因此 scanf 吃掉尾随的换行符:
while (fscanf(filePtr, "%c, %d, %d ", &player, &row, &column)) != EOF) {
printBoard(emptyBoard)
但它被定义为不接受任何参数,并且您创建了一个本地 array
。试试这个:void printBoard(size_t row, size_t column, char array[row][column]) {
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < column; j++) {
printf("%c ", array[i][j]);
}
printf("\n");
}
}
...
printBoard(3, 3, emptyBoard);
char board[3][3];
memcpy(board, emptyBoard, sizeof(emptyBoard);
board[row][column] = player;
printBoard(3, 3, board);
答案 1 :(得分:0)
我知道这不是您要的,但我注意到您在 printBoard(emptyBoard) 中将一个变量传递给 printBoard,但该函数实际上不接受任何参数。这里将打印的是一个“随机”的值集合。
至于您问的是什么,您是否将任何参数传递给您的可执行文件?例如,如果它的标题是“运行”,您是输入 ./run file.txt
还是只输入 ./run
?如果您正在执行后者,则会导致分段错误,因为您正在尝试加载未分配给 argv 的值。 Allan 也是正确的,如果您正在加载的文件调用高于 3 的行或列,则会发生分段错误,因为您试图访问未分配给 emptyBoard 的内存。
至于查找运行时错误的原因,我发现在程序的不同步骤中放置打印语句非常有帮助。您可以学习使用调试器。