C语言中gets与fgets函数差异:两段代码输出长度不同的疑问
两段C代码差异的原因分析
核心差异在于**gets()和fgets()两个输入函数的行为完全不同**,尤其是对输入末尾换行符的处理,直接导致了字符长度计算结果的差异:
1. 第一段代码(gets())的行为
当你输入14:45并按下回车时:
gets()会读取用户输入的14:45(共5个字符),但会自动丢弃输入末尾的换行符\n。- 之后它会在数组末尾添加字符串终止符
\0,所以tim数组中的内容是:'1','4',':','4','5','\0'。 - 不管是自己循环计数还是用
strlen(),统计的都是\0之前的有效字符数,也就是5,所以输出结果为5。
注意:
gets()是已被废弃的危险函数,它不检查缓冲区大小,如果输入长度超过SIZE会直接造成缓冲区溢出,绝对不要在实际代码中使用。
2. 第二段代码(fgets())的行为
同样输入14:45并按下回车时:
fgets()会读取包括换行符\n在内的输入内容,且会严格遵循指定的最大读取长度(第二个参数SIZE)。这里SIZE=7,所以最多读取7-1=6个字符(留一个位置给\0)。- 输入的
14:45加换行符刚好是6个字符,所以tim数组中的内容是:'1','4',':','4','5','\n','\0'。 - 循环计数或
strlen()统计的是\0之前的6个字符(5个输入字符+1个换行符),所以输出结果为6。
补充:关于strlen()的结果差异
strlen()的作用是计算从起始地址到第一个\0之间的字符数量,不包含\0本身。所以:
- 用
gets()时,\0前有5个字符,strlen(tim)返回5; - 用
fgets()时,\0前有6个字符(含换行),strlen(tim)返回6。
内容的提问来源于stack exchange,提问作者PLC_Guy
相关产品推荐
相关产品推荐

