C++二维字符数组输入验证问题:井字棋仅允许输入'x'/'o'
问题分析与修正方案
核心问题:输入验证逻辑失效
你的输入验证代码只检查了board[SIZE][SIZE],这属于数组越界访问(C++数组下标从0开始,3x3数组的合法下标范围是0-2),而且完全没有遍历所有9个输入元素,自然无法完成全输入的合法性校验。
修正输入验证逻辑
需要通过嵌套循环遍历二维数组的每一个元素,逐个检查是否为'x'或'o':
// Check board contains only x's and o's bool valid = true; for (int r = 0; r < SIZE; r++) { for (int c = 0; c < SIZE; c++) { // 注意用&&:当前字符既不是x也不是o时判定非法 if (board[r][c] != 'x' && board[r][c] != 'o') { valid = false; break; // 找到非法字符就跳出内层循环 } } if (!valid) break; // 内层发现非法,直接终止外层循环 } if (!valid) { cout << "Sorry you can only enter 'x' and 'o'" << endl; exit(1); }
额外小问题修正
你的列检查代码中,winner的赋值下标写错了:
// 原错误代码 winner = board[c][0]; // 修正为 winner = board[0][c];
因为你是检查第c列,列的第一个元素是board[0][c],而board[c][0]是第c行第0列的元素,逻辑不符。
另外,第二条对角线的winner赋值也可以调整为board[2][0],和对角线起点保持一致,避免逻辑混淆:
if ((board[2][0] == board[1][1]) && (board[1][1] == board[0][2])) winner = board[2][0];
完整修正代码
#include <cstdlib> #include <iostream> using namespace std; int main() { // Declare 2D array const int SIZE = 3; char board[SIZE][SIZE]; // Read x's and o's cout << "Enter x's and o's on board (L-R, T-B): "; for (int r = 0; r < SIZE; r++) for (int c = 0; c < SIZE; c++) cin >> board[r][c]; // Print 2D array cout << "\n+---+---+---+\n"; for (int r = 0; r < SIZE; r++) { cout << "| "; for (int c = 0; c < SIZE; c++) cout << board[r][c] << " | "; cout << "\n+---+---+---+\n"; } // Check board contains only x's and o's bool valid = true; for (int r = 0; r < SIZE; r++) { for (int c = 0; c < SIZE; c++) { if (board[r][c] != 'x' && board[r][c] != 'o') { valid = false; break; } } if (!valid) break; } if (!valid) { cout << "Sorry you can only enter 'x' and 'o'" << endl; exit(1); } // Check first diagonal to see who wins char winner = ' '; if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2])) winner = board[0][0]; // Check second diagonal to see who wins if ((board[2][0] == board[1][1]) && (board[1][1] == board[0][2])) winner = board[2][0]; // Check rows to see who wins for (int r = 0; r < SIZE; r++) if ((board[r][0] == board[r][1]) && (board[r][1] == board[r][2])) winner = board[r][0]; // Check columns to see who wins for (int c = 0; c < SIZE; c++) if ((board[0][c] == board[1][c]) && (board[1][c] == board[2][c])) winner = board[0][c]; // Print winner if (winner != ' ') cout << "Congratulations " << winner << " is the winner\n"; else cout << "Sorry, no one wins\n"; return 0; }
内容的提问来源于stack exchange,提问作者Adrian Pena
相关产品推荐
相关产品推荐

