长度为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
相关产品推荐
相关产品推荐

