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

C语言井字棋程序函数调用时崩溃问题求助

井字棋程序崩溃问题排查与修复

你的程序崩溃主要由三个关键问题导致,逐一解决后就能正常运行:

1. void函数非法返回值

p1Turn函数声明为void类型,意味着它不允许返回任何值,但你在函数末尾写了return playerOneInput;,这属于未定义行为,是导致程序崩溃的直接原因之一。

修复代码:

void p1Turn (void)
{
    printf("\nEnter a value between 1-9 to choose the corresponding space:");
    scanf(" %c", &playerOneInput); // 顺便修复第二个问题
    // 删除无效的return语句
}

2. scanf读取%c时的换行符残留

使用scanf("%c", ...)时,它会读取输入缓冲区里的所有字符,包括你输入数字后按下的换行符\n。第一次输入后,换行符留在缓冲区,第二次调用scanf会直接读取这个换行符,导致playerOneInput变成无效值,触发后续逻辑错误。

修复方法:在%c前加一个空格,让scanf自动跳过所有空白字符(包括换行、空格、制表符):

scanf(" %c", &playerOneInput);

3. 数组越界访问

boardSpaces数组的大小是10,有效索引范围是0~9,但p1markBoard函数里的循环条件是loop <=10,这会访问boardSpaces[10]——超出数组边界的内存,会破坏程序的内存结构,直接导致崩溃。

修复代码:

void p1markBoard(void)
{
    char loop;
    // 循环条件改为loop < 10,只访问0~9的合法索引
    for (loop = 0; loop < 10; loop++ ){
            if ( boardSpaces[loop] == playerOneInput){
            boardSpaces[loop] = playerOneMarkX;
            }
    }
}

额外优化建议

  • 尽量避免使用全局变量,比如可以把playerOneInput作为参数传递给p1markBoard函数,减少全局状态带来的潜在问题。
  • 可以在输入后增加合法性检查,比如判断输入是否在'1'~'9'之间,以及对应的棋盘位置是否未被占用,避免无效输入导致的逻辑错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:30:26