fgets、gets_s和fputs
发布日期:2021-06-29 11:13:54
浏览次数:3
分类:技术文章
本文共 1725 字,大约阅读时间需要 5 分钟。
C Primer Plus总结
gets和puts的替代品 fgets()函数通过第2个参数限制读入的字符数来解决溢出的问题。该函 数专门设计用于处理文件输入,所以一般情况下可能不太好用。fgets()和 gets()的区别如下。fgets()函数的第2个参数指明了读入字符的最大数量。如果该参数的值是n,那么fgets()将读入n-1个字符,或者读到遇到的第一个换行符为止。 如果fgets()读到一个换行符,会把它储存在字符串中。这点与gets()不 同,gets()会丢弃换行符。fgets()函数的第3 个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin(标准输入)作为参数,该标识符定义在stdio.h中。 因为 fgets()函数把换行符放在字符串的末尾(假设输入行不溢出),通 常要与 fputs()函数(和puts()类似)配对使用,除非该函数不在字符串末尾 添加换行符。fputs()函数的第2个参数指明它要写入的文件。如果要显示在 计算机显示器上,应使用stdout(标准输出)作为该参数。程序清单11.7演 示了fgets()和fputs()函数的用法。
#include#define SIZE 14int main() { char words[SIZE]; puts("Enter a string, please."); fgets(words, SIZE, stdin); printf("Your string twice:\n"); puts(words); fputs(words, stdout); return 0;}
如果一切进行顺利,fgets函数返回的地址与传入的第 1 个参数相同。但是,如果函数读到文件结尾,它将返回一个特殊的指针:空指针(null pointer)。该指针保证不会指向有效的数据,所以可用于标识这种特殊情况。在代码中,可以用数字0来代替,不过在C语言中用宏NULL来代替更常见(如果在读入数据时出现某些错误,该函数也
返回NULL)。C11新增的gets_s()函数(可选)和fgets()类似,用一个参数限制读入的
字符数。假设把程序清单11.9中的fgets()换成gets_s(),其他内容不变,那么 下面的代码将把一行输入中的前9个字符读入words数组中,假设末尾有换行 符: gets_s(words, STLEN); gets_s()与fgets()的区别如下。 gets_s()只从标准输入中读取数据,所以不需要第3个参数。 如果gets_s()读到换行符,会丢弃它而不是储存它。 如果gets_s()读到最大字符数都没有读到换行符,会执行以下几步。首 先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换 行符或文件结尾,然后返回空指针。接着,调用依赖实现的“处理函数”(或 你选择的其他函数),可能会中止或退出程序。 第2个特性说明,只要输入行未超过最大字符数,gets_s()和gets()几乎一 样,完全可以用gets_s()替换gets()。第3个特性说明,要使用这个函数还需要 进一步学习。 我们来比较一下 gets()、fgets()和 gets_s()的适用性。如果目标存储区装 得下输入行,3 个函数都没问题。但是fgets()会保留输入末尾的换行符作为 字符串的一部分,要编写额外的代码将其替换成空字符。 如果输入行太长会怎样?使用gets()不安全,它会擦写现有数据,存在 安全隐患。gets_s()函数很安全,但是,如果并不希望程序中止或退出,就 要知道如何编写特殊的“处理函数”。另外,如果打算让程序继续运行, gets_s()会丢弃该输入行的其余字符,无论你是否需要。由此可见,当输入 太长,超过数组可容纳的字符数时,fgets()函数最容易使用,而且可以选择 不同的处理方式。所以,当输入与预期不符时,gets_s()完全没有fgets()函数方便、灵活。也许这也是gets_s()只作为C库的可选扩展的原因之一。鉴于此,fgets()通常 是处理类似情况的最佳选择。
转载地址:https://blog.csdn.net/ZWHSOUL/article/details/79417999 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月02日 18时44分55秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
经典面试题:如何保证缓存与数据库的双写一致性?
2019-04-29
一份来自亚马逊工程师的Google面试指南,GitHub收获9.8万星,已翻译成中文
2019-04-29
硬货 | Redis 性能问题分析
2019-04-29
Kafka为什么这么快?
2019-04-29
灵魂四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?
2019-04-29
一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!
2019-04-29
酸爽!IDEA 中这么玩 MyBatis,让编码速度飞起!
2019-04-29
已拿 Offer!字节跳动面试经验分享
2019-04-29
汇总一下 Intellij IDEA 常用的牛逼插件!
2019-04-29
给 Spring Boot 项目减减肥!18.18M 到 0.18M 是如何做到的?
2019-04-29
Java高并发之设计模式,设计思想
2019-04-29
再见,Navicat!我爱上了别人...
2019-04-29
我,一个靠GitHub打赏谋生的码农,年入十万美元
2019-04-29
面试官扎心一问:数据量很大,分页查询很慢,有什么优化方案?
2019-04-29
说说 Spring MVC 的执行过程?
2019-04-29
他被称为"中国第一程序员",一人之力单挑微软,如今拜入武当修道
2019-04-29
TCP协议面试灵魂10问,建议收藏~
2019-04-29
消息队列常见的几种使用场景介绍!
2019-04-29