C语言编写井字棋程序运行返回退出码-1073741819如何解决
问题原因及修复方案
直接崩溃原因
你遇到的空指针读取异常是由函数调用参数写错直接导致的:
主函数结尾的判断语句if (evaluateWinConditions(board == 1))存在语法错误:
board == 1是布尔比较运算,返回值只有0(假)或1(真),你把这个整数值作为指针参数传给了需要接收二维数组的evaluateWinConditions函数- 当该值为0时就等价于传入空指针,函数内部访问
board[0][0]就会触发空指针读取异常,就是你遇到的报错。
其他隐藏bug
除了上述直接崩溃的问题,你的代码还有多处逻辑错误会导致功能无法正常运行:
- 玩家2落子的赋值语句写为了判断语句:
board[row][column] == 'O';双等号是比较运算,不会修改数组值,要改为单等号赋值board[row][column] = 'O'; - 胜负判定的三连逻辑错误:C语言中
a == b == c不是判断三个值相等,而是先计算a==b得到0/1的布尔值,再用这个布尔值和c比较,完全不符合预期,需要改为a == b && b == c的格式 - 字符比较误用字符串:
if (board[0][0] == "X")中双引号包裹的"X"是字符串指针,要比较字符需要用单引号'X' - 没有坐标边界校验:按下方向键时
row和column会出现小于1或大于3的情况,直接作为数组下标会导致越界访问,另外你的光标坐标是1开始,数组下标是0开始,需要做下标转换 - 数组初始化错误:
char board[3][3] = {{"-"}};中"-"是字符串,要初始化字符应该用单引号'-',且需要初始化所有元素为'-'避免随机值干扰判定
修复后的完整代码
#include <stdio.h> #include <conio.h> char evaluateWinConditions(char board[3][3]); int main(void) { // 初始化棋盘并打印 char board[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { board[i][j] = '-'; } puts("---"); } char key = 0; // 光标坐标1开始,数组下标0开始 int row = 1, column = 1; int player = 1; printf("\033[%d;%dH", row, column); while (evaluateWinConditions(board) == 0) { key = _getch(); switch (key) { case 'a': if (column > 1) column -= 1; break; case 'w': if (row > 1) row -= 1; break; case 'd': if (column < 3) column += 1; break; case 's': if (row < 3) row += 1; break; case ' ': // 只有空位可以落子 if (board[row-1][column-1] == '-') { if (player == 1) { printf("%c", 'X'); board[row-1][column-1] = 'X'; player = 2; } else { printf("%c", 'O'); board[row-1][column-1] = 'O'; player = 1; } } break; } printf("\033[%d;%dH", row, column); } printf("\033[5;1H"); if (evaluateWinConditions(board) == 1) printf("Player 1 wins."); else printf("Player 2 wins."); _getch(); return 0; } char evaluateWinConditions(char board[3][3]) { // 横向三连 for (int i = 0; i < 3; i++) { if (board[i][0] != '-' && board[i][0] == board[i][1] && board[i][1] == board[i][2]) { return board[i][0] == 'X' ? 1 : 2; } } // 纵向三连 for (int j = 0; j < 3; j++) { if (board[0][j] != '-' && board[0][j] == board[1][j] && board[1][j] == board[2][j]) { return board[0][j] == 'X' ? 1 : 2; } } // 对角线三连 if (board[0][0] != '-' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) { return board[0][0] == 'X' ? 1 : 2; } if (board[0][2] != '-' && board[0][2] == board[1][1] && board[1][1] == board[2][0]) { return board[0][2] == 'X' ? 1 : 2; } // 无胜者 return 0; }
内容的提问来源于stack exchange,提问作者user15194704
相关产品推荐
相关产品推荐

