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

为什么C语言转换说明符无法正常工作,字符数组存储内容不符合预期

问题原因

  • 你的initials数组长度仅为5,而输入的J. S.本身就占了5个字符(J、.、空格、S、.)。C语言中字符串需要以\0作为结束标记,scanf的%[^\n]格式符会在读取到的内容末尾自动追加\0,这就导致实际写入的字节数是6,直接超出了initials数组的边界,多出的\0会写到数组后方的内存空间。
  • 结构体的成员在内存中是按定义顺序连续存储的,initials数组后方紧接着就是name数组的内存区域,你第一次写入时越界的\0刚好落在name的第一个字节位置。
  • 后续读取姓名写入name数组时,直接覆盖了刚才越界写入的\0,导致initials数组完全没有字符串结束标记。当你用%s打印initials时,printf会一直向后读取内存,直到遇到\0才停止,自然就会把紧挨着的name数组的内容也一起打印出来,就出现了J. S.John Smith的结果。
  • 额外注意你写的%6[^\n]格式符允许最多读取6个非换行字符,和initials的5字节长度完全不匹配,这也是越界的直接诱因。

修复方案

  1. 扩大initials数组的长度,至少要预留1个字节存储结束标记,比如改为char initials[6];
  2. 调整scanf的读取长度限制,和数组大小匹配:读取initials时改为%5[^\n],最多读取5个有效字符,留1位存自动追加的\0;读取name时改为%34[^\n],对应name数组的35字节长度。
  3. 保险起见可以在每次读取字符串后,手动给数组最后一位赋值\0,例如:
person.initials[sizeof(person.initials) - 1] = '\0';
person.name[sizeof(person.name) - 1] = '\0';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 05:57:01