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
相关产品推荐
相关产品推荐

