C语言if语句比较二维char数组元素 条件成立count不增加问题排查
C代码问题修复说明
核心错误点
- 连续相等判断逻辑错误
C语言中a == b == c的执行逻辑是先判断a == b得到布尔值(真为1,假为0),再将这个布尔值和c比较,完全不符合“三个值相等”的判断需求。需要修改为a == b && b == c的形式,对应第20、27、32、36行的判断条件全部需要调整。 - 数组定义越界
你定义的二维数组是char t[2][2],合法索引范围是行/列都为0~1,但代码中用到了索引0、1、2三个维度,会出现越界访问导致数据异常,需要修改为char t[3][3]。 - 循环逻辑错误
外层循环for (int i = 0; i < n; n++)中增量错误写为n++,会导致循环无法正常终止,需要改为i++;读取输入的循环for (int i = 1; i <= 3; i++),数组下标从0开始,需要改为for (int i = 0; i < 3; i++)。 - 输入缓冲区残留换行符问题
scanf("%d", &n)执行后,输入缓冲区会残留换行符,后续读取字符会把换行符误判为输入内容,需要在读取n后加getchar()消耗残留换行。 - 下划线判断逻辑拦截了有效输入
你的测试输入没有_字符,所以整个计数逻辑被外层的if (有下划线)判断拦截,根本不会执行计数逻辑,这也是count始终为0的直接原因,如果需求不需要下划线判断可以删除该层判断,或者调整判断逻辑适配你的业务场景。
修正后可运行代码
#include <stdio.h> int main() { int n; scanf("%d", &n); getchar(); // 消耗读取n后残留的换行符 for (int i = 0; i < n; i++) // 修正增量为i++ { int count = 0; char t[3][3]; // 修正数组大小为3*3 for (int i = 0; i < 3; i++) // 修正循环下标从0开始 { scanf("%c %c %c", &t[i][0], &t[i][1], &t[i][2]); getchar(); // 消耗每行输入后的换行符 } // 移除了无下划线就不执行计数的判断,若业务需要可自行调整 for (int j = 0; j < 3; j++) { // 修正三值相等判断逻辑 if (t[j][0] == t[j][1] && t[j][1] == t[j][2]) { count++; } } for (int q = 0; q < 3; q++) { if (t[0][q] == t[1][q] && t[1][q] == t[2][q]) { count++; } } if (t[0][0] == t[1][1] && t[1][1] == t[2][2]) { count++; } else if (t[0][2] == t[1][1] && t[1][1] == t[2][0]) { count++; } if (count == 0) { printf("%d", 2); } else if (count == 1) { printf("%d", 1); } else if (count > 1) { printf("%d", 3); } } return 0; }
内容的提问来源于stack exchange,提问作者Vikram Sawant
相关产品推荐
相关产品推荐

