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

C语言调用无关函数后char数组首元素变为null的原因与解决办法

问题根本原因

该问题由栈缓冲区溢出导致,具体触发逻辑:

  • 你在循环中定义的proposedSquare数组长度仅为2,仅能存储2个char类型数据
  • whosTurn中使用scanf("%s", proposedcoordinate)接收用户输入时,%s格式符会自动在输入内容末尾追加一个\0(空终止符)作为字符串结束标识。哪怕用户仅输入2个有效字符(比如符合规则的坐标a1),实际写入内存的总长度为3字节,直接超出proposedSquare的容量限制
  • 栈上的局部变量是连续排布的,越界写入的\0刚好覆盖了和proposedSquare相邻的row0数组首元素,最终表现为棋盘首行第一个元素被替换为null字符,打印异常。
修复方案

按以下步骤修改即可彻底解决问题:

  1. 扩大proposedSquare数组容量,至少为空终止符预留1字节空间。由于你的坐标规则为1位字母+1位数字,最多仅需2个有效字符,因此将数组长度定义为3即可,也可以设置更长的长度预留冗余,进一步避免异常输入导致溢出:
// 修改循环内的数组定义
char proposedSquare[3];
  1. 给scanf增加输入长度限制,避免用户输入过长内容溢出缓冲区:
// 将whosTurn函数中两处scanf都修改为如下格式,%2s表示最多读取2个有效字符
scanf("%2s", proposedcoordinate);

如果不需要把坐标当成字符串处理,也可以直接用%c%c分别接收两个坐标字符,完全规避字符串终止符的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:00:01