首页 >> 宝藏问答 >

C 语言 gets 函数自动换行

2026-11-05 08:41:39 来源:网易 用户:韩庆莎 

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 函数,因代码运行造成的程序崩溃内存异常等问题,使用者自行承担相关风险。

 

相关阅读

最新文章