井字棋程序Switch Case失效,输入坐标后无响应求助
井字棋程序输入后无响应的问题排查与修复
你的程序输入坐标后无响应,是几个关键语法和逻辑错误导致的,下面逐一说明并给出修复方案:
核心错误点
scanf参数错误:scanf("%lf",a);中,scanf需要接收变量的地址来存储输入值,直接传a会触发内存访问异常,导致程序卡死。必须改成scanf("%lf", &a);。- 字符初始化错误:
char c1,c2,c3,c4,c5,c6,c7,c8,c9='';的空字符写法无效,且仅初始化了c9,其他字符变量为随机值。应统一初始化为空格:char c1=' ', c2=' ', c3=' ', c4=' ', c5=' ', c6=' ', c7=' ', c8=' ', c9=' ';。 printf格式符错误:打印单个字符时误用了%s(字符串格式符),需改用%c(字符格式符)。比如printf("| %c | %c | %c |\n", c1, c2, c3);,否则会把字符当作字符串指针,引发内存访问错误。switch分支遗漏break:case 6后未加break;,导致输入6时会同时执行case7的代码,错误修改c7的值,需在case6后补充break;。
修复后的完整代码
#include <stdio.h> //Date:17/10/2022, By Raunak Shahi int main(void) { int i=0; int coord=0; // 初始化所有棋盘字符为空格 char c1=' ', c2=' ', c3=' ', c4=' ', c5=' ', c6=' ', c7=' ', c8=' ', c9=' '; char input=''; double a; printf("Here's the number assigned to each cell:\n"); //Showing the user the coordinates of each cell through the demo table printf(" ___________ \n"); printf("| 1 | 2 | 3 |\n"); printf("|___|___|___|\n"); printf("| 4 | 5 | 6 |\n"); printf("|___|___|___|\n"); printf("| 7 | 8 | 9 |\n"); printf("|___|___|___|\n"); for(i=1;i<=9;i++){ //Printing the table each turn until the game is finished if(i%2==0){ input='O'; printf("Nought's turn, enter a coordinate:"); }else{ input='X'; printf("Cross's turn, enter a coordinate:"); // 修正拼写错误 coorinate -> coordinate } // 传a的地址给scanf scanf("%lf", &a); coord=(int)a; switch(coord){ case 1: c1=input; break; case 2: c2=input; break; case 3: c3=input; break; case 4: c4=input; break; case 5: c5=input; break; case 6: c6=input; break; // 添加break,避免执行case7 case 7: c7=input; break; case 8: c8=input; break; case 9: c9=input; break; } printf(" ___________ \n"); // 用%c打印单个字符 printf("| %c | %c | %c |\n", c1, c2, c3); printf("|___|___|___|\n"); printf("| %c | %c | %c |\n", c4, c5, c6); printf("|___|___|___|\n"); printf("| %c | %c | %c |\n", c7, c8, c9); printf("|___|___|___|\n"); } return 0; }
另外顺便修正了提示文本里的拼写错误:coorinate改为coordinate。
内容的提问来源于stack exchange,提问作者Raunak Shahi
相关产品推荐
相关产品推荐

