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

长度为10的char数组用%s输出显示11个字符的原因咨询

问题根源:C语言字符串的空字符终止陷阱

嘿,这个坑我刚学C的时候也踩过!核心原因其实是C语言里的字符串必须以\0(空字符)作为结束标志,而你刚好忽略了这一点。

你定义的char数组长度是10,当你把超过10个字符的输入的前10个存进去时,数组的每个位置(索引0到9)都被填满了字符,根本没地方放\0。而像printf("%s")这类字符串输出函数,会从数组起始位置开始读取内存,直到遇到\0才停止——这时候它就会越界读取数组后面的内存字节。

刚好在你的场景里,数组后面的那个内存字节刚好是输入缓冲区里剩下的第11个字符,所以就出现了"显示前11个字符"的情况。但要注意,这属于未定义行为,换个环境可能会输出乱码甚至程序崩溃,因为你永远不知道数组后面的内存里存的是什么。

解决办法

  • 最简单的调整:把数组长度设为11,这样存10个有效字符后,还能留一个位置给\0;
  • 如果必须用长度10的数组:在存储完10个字符后,手动给数组的最后一个位置(索引9)设置为\0,比如buf[9] = '\0';;
  • 更规范的做法:用fgets这类安全的输入函数,它会自动帮你在末尾添加\0。比如fgets(buf, sizeof(buf), stdin);,不过要注意它会把输入的换行符也读进去,需要额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:32:19