You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:14:55