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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:07:28