C语言开发井字棋使用%c/%s打印字符输出奇怪符号问题求助
C语言井字棋打印异常问题解决方案
核心错误说明
- 打印参数错误:
printf的%c格式化符要求传入字符变量的值,你在传参时加了&取地址符,实际传入的是变量的内存地址。地址值对应的ASCII码大多是不可见控制符,就会出现心形、笑脸之类的乱码。 - 字符赋值错误:
char mark = "X";写法错误,双引号包裹的是字符串常量,本质是指针类型,赋值给char变量会发生类型截断,属于未定义行为。单个字符需要用单引号包裹,改为char mark = 'X';。 - 落子逻辑写反:现有判断逻辑是把格子的数字赋值给
mark,实际应该是把玩家的落子符号(X)赋值给对应格子变量,这样棋盘才会更新。 - 语法不规范:
void main是非标准写法,标准C要求main函数返回值为int。 - 逻辑冗余:大量
goto语句完全没有必要,用数组存储棋盘可以大幅简化代码。
修正后的完整代码
#include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { char mark = 'X'; char mark2 = 'O'; int choice; // 用数组存棋盘,索引0不用,方便对应1-9的位置 char board[10] = {' ', '1','2','3','4','5','6','7','8','9'}; printf("please enter a position 1-9:\n "); scanf_s("%d", &choice); // 校验位置合法且未被占用 if(choice >=1 && choice <=9 && board[choice] == '0' + choice) { board[choice] = mark; } else { printf("无效位置,请重新输入\n"); return 1; } // 打印棋盘,直接传数组元素值,不要加& printf(" %c | %c | %c \n", board[1], board[2], board[3]); printf("---------+---------------+---------\n"); printf(" %c | %c | %c \n", board[4], board[5], board[6]); printf("---------+---------------+---------\n"); printf(" %c | %c | %c \n", board[7], board[8], board[9]); return 0; }
保留原单变量写法的最小修改方案
如果你不想改动现有变量定义结构,只需要做两处修改即可解决乱码问题:
- 把
char mark = "X";改为char mark = 'X'; - 把所有打印语句里变量前的
&符号删掉,同时把判断分支里的赋值逻辑反过来,比如choice ==1时执行place = mark;而非mark = place;
内容的提问来源于stack exchange,提问作者Punz
相关产品推荐
相关产品推荐

