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

C语言读取井字棋二维字符数组输入异常的解决方法

解决C语言读取井字棋无空格输入的错位问题

问题根源是scanf("%c")会读取输入中的换行符,你输入的每行(比如X0X)结束后的回车会被当成有效字符读进二维数组,导致输出时出现多余空行和字符错位。C++的cin默认会跳过空白字符(换行、空格等),所以不会有这个问题,但C的scanf("%c")没有自动跳过空白的逻辑。

以下是三种可行的解决办法:

方法一:在scanf格式串前加空格跳过空白

在%c前加一个空格,这个空格会匹配任意数量的空白字符(包括换行、空格、制表符),自动跳过无效字符后再读取棋盘的有效字符:

char a[3][3];
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        scanf(" %c", &a[i][j]); // 注意%c前的空格
    }
}

这种方法最简单,适配大部分无空格/有少量空格的输入场景。

方法二:手动吃掉每行末尾的换行符

读完每行的3个字符后,用getchar()或者scanf("%*c")主动读取并丢弃换行符:

char a[3][3];
for (int i = 0; i < 3; i++) {
    // 读取当前行的3个棋盘字符
    for (int j = 0; j < 3; j++) {
        scanf("%c", &a[i][j]);
    }
    getchar(); // 吃掉当前行末尾的换行符
}

注意:如果输入中存在多余的空格,这种方法可能会出错,适合严格按「3字符+换行」的输入格式。

方法三:用fgets读取整行再提取字符

直接读取每行字符串,再从字符串中提取前3个字符存入数组,彻底避免换行符干扰:

#include <stdio.h>
#include <string.h>

int main() {
    char a[3][3];
    char line[4]; // 存储每行内容(3个棋盘字符+最多1个换行符)
    
    for (int i = 0; i < 3; i++) {
        fgets(line, sizeof(line), stdin);
        // 去掉字符串末尾的换行符(如果存在)
        line[strcspn(line, "\n")] = '\0';
        // 将每行的3个字符存入数组
        for (int j = 0; j < 3; j++) {
            a[i][j] = line[j];
        }
    }

    // 测试输出示例
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%c", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

这种方法容错性最高,即使输入行末尾有多余字符也不会影响棋盘内容的读取。

内容的提问来源于stack exchange,提问作者Humanware

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:58:26