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

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;
}

保留原单变量写法的最小修改方案

如果你不想改动现有变量定义结构,只需要做两处修改即可解决乱码问题:

  1. 把char mark = "X";改为char mark = 'X';
  2. 把所有打印语句里变量前的&符号删掉,同时把判断分支里的赋值逻辑反过来,比如choice ==1时执行place = mark;而非mark = place;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:45:03