C 语言 gets 函数自动换行
C 语言里面的 gets 函数本身并不会主动输出换行符,它的核心作用是读取一行输入,读取规则是遇到回车换行符就停止读取,并且会把这个换行符丢弃,不会保存到读入的字符串缓冲区里面,很多初学者误以为 gets 会自动换行,大多是因为终端本身在按下回车的时候,界面已经产生换行显示,或者后续代码里面额外调用了 printf 输出换行,把这个现象混淆成 gets 函数自带自动换行的功能。gets 读取的时候,用户在控制台输入字符,一直敲回车,回车对应的换行标记是输入结束信号,gets 拿到这一行内容之后,字符串末尾会补上空字符作为结束标记,原输入末尾的换行符不会存进数组,所以调用完 gets 之后,字符串内部没有换行字符,函数本身也不会打印任何内容,不会主动执行换行输出。
原理说明
gets 函数的设计目标就是按行读取标准输入,它和 fgets 有明显区别,fgets 会把读到的换行符保留在字符串内,gets 则是替换为空终止符,这是两者最关键差异。控制台终端属于行缓冲模式,用户按下回车键,终端就会把这一行数据提交给程序,同时终端界面完成换行显示,这个换行是终端硬件界面的行为,不是 gets 函数执行的动作,这就是产生误解的根本原因。另外 gets 函数存在严重安全缺陷,它不检查缓冲区长度,输入字符超过数组大小就会造成缓冲区溢出,现代 C 标准已经移除了 gets 函数,新代码不推荐继续使用。
实现想要自动换行效果的写法
如果业务需求是读取输入之后,让输出界面自动换行,需要手动补充换行输出,不能指望 gets 本身完成这个动作。
基础示例逻辑
第一步 定义字符数组用来保存输入内容
第二步 调用 gets 读取用户输入
第三步 如果需要界面换行,使用 printf 输出换行符
示例代码逻辑
char buf [100];
gets (buf);
printf ("输入内容是 % s\n",buf);
这里的换行是 printf 里面的 \n 实现,不是 gets 自动完成。
替代方案推荐
因为 gets 已经废弃,推荐改用 fgets,fgets 读取一行之后会保留换行符,如果想要去掉换行符,可以手动遍历字符串把换行符替换成空字符。
对比表格
项目 gets 函数 fgets 函数
是否保留输入换行符 不保留 保留
是否检查缓冲区长度 不检查 会限制读取长度
标准状态 C11 标准正式删除 一直保留,推荐使用
安全风险 缓冲区溢出风险高 相对安全
【常见问题】
问题 1 C 语言 gets 函数自动换行是不是函数自带的功能
回答 1 C 语言 gets 函数自动换行并不是 gets 自带功能,换行来自终端回车显示或者后续 printf 的换行符,gets 本身只负责读取字符串并且丢弃输入末尾换行符。
问题 2 C 语言 gets 函数自动换行和 fgets 保留换行有什么差别
回答 2 C 语言 gets 函数自动换行相关特性里,gets 丢弃换行符,fgets 会把换行符存入字符串,所以 fgets 读出来的字符串末尾自带换行字符,不需要额外打印换行。
问题 3 C 语言 gets 函数自动换行现象下为什么不建议继续使用 gets
回答 3 C 语言 gets 函数自动换行这个现象容易掩盖 gets 本身的安全缺陷,gets 没有长度校验,输入超长会溢出破坏内存,新标准已经删除,所以不建议继续使用。
【免责申明】
本文内容仅用于 C 语言基础知识学习参考,代码示例仅做原理演示,实际工程开发请勿继续使用已废弃的 gets 函数,因代码运行造成的程序崩溃内存异常等问题,使用者自行承担相关风险。
相关阅读
-
上海健康医学院是上海市属公办应用型本科医学院,地处浦东张江国际医学园区,由三所有老牌医药专科底子的学校...浏览全文>>
-
核心结论就是数学里面字母 c 没有固定唯一含义,它属于通用代数字母,含义会跟着题目场景变化,最常见的用法...浏览全文>>
-
C 语言数组就是相同数据类型元素的有序集合,在内存里面连续存放,数组定义的标准格式是 数据类型 数组名 ...浏览全文>>
-
苹果手机虎牙充值,最稳妥、便宜的正规渠道是虎牙官网网页端或者电脑客户端充值,避开苹果 App 内购,苹果内...浏览全文>>
-
C 语言里面的 gets 函数本身并不会主动输出换行符,它的核心作用是读取一行输入,读取规则是遇到回车换行符...浏览全文>>
-
联想笔记本蓝牙主要分系统软件开关、键盘快捷键开关两种,部分老机型还有物理无线开关,台式机如果没有自带蓝...浏览全文>>
-
C 罗最新个人签名战靴属于耐克 CR7 签名产品线,该系列是耐克专门为 C 罗打造的专属签名足球鞋,命名体系...浏览全文>>
-
正规减肥中心短期确实可以让体重下降,但并不是所有人都能成功,而且很多减重主要是脱水、掉肌肉,并不是纯减...浏览全文>>
-
Cytus2 预购礼包是游戏发售前预购玩家专属福利 里面一般包含限定角色皮肤 额外曲包 头像 纪念道具这类内...浏览全文>>
-
诟病读音是 gòu bìng,诟读第四声,病读第四声,诟病是书面常用动词,核心意思是指责 非议,也就是指出别...浏览全文>>
- cure 去角质凝胶身上能用吗 身体使用注意事项详解
- 牙签是可回收垃圾吗 垃圾分类科普解答
- 蓝牙耳机的佩戴方法 分清左右调整稳固防掉落
- 喝什么饮料比较健康 优先选择低糖无添加饮品
- 做梦梦到牙齿松动 梦境解析与生理原因
- consecutive 的讲解 词根词义搭配全解析
- 山药炖羊肉的做法 暖身家常炖制教程
- cf 英雄级人物买哪个好 角色选购推荐
- cdr 连筋字体怎么做 刻字连筋字制作教程
- cctv 台标进化史 央视台标版本演变介绍
- CAN 总线的检修方法 实操深度解析
- CAD 多段线合并
- c2c 的含义 电商商业模式详细解读
- blz51901016 断开连接 报错排查解决指南
- bilibili 网页版怎么调倍速 播放器操作详细指南
- bad 的副词怎么写怎么写 词性转换讲解
- B2B 电子商务的含义 商业模式深度解读
- au750 变黄了怎么清洗 详细处理教程
- antbang 无线路由器设置 路由器配置操作指南
- amd 闪龙处理器怎么样 产品详解介绍
