gets()函数简单易用,它读取整行输入,直到遇到换行符,然后丢弃换行符,储存其余的字符,并在这些字符的末尾添加一个空字符使其成为一个字符串。

那它的缺陷在哪里呢?

问题出在gets()只有唯一一个参数,数组名会被转换成该数组首元素的地址,它无法检查数组是否装得下输入行。

它只知道数组的开始处,并不知道数组中有多少个元素。

如果输入的字符串超过了数组的大小,会导致缓冲区溢出(buffer overflow),如果这些多余的字符只是占用了尚未使用的内存,就不会立即出现问题;如果它们擦写掉程序中的其他数据,会导致程序异常中止。

过去,有些人通过系统编程,利用gets()插入和运行了一些破坏系统安全的代码。

解决方法

使用fgets()来替代,fgets()函数通过第2个参数限制读入字符数来解决溢出的问题。

该函数专门设计用于处理文件输入。

fgets()函数的第2个参数指明了读入字符的最大数量,如果是n,读入n - 1个字符 或者 读到遇到的第一个换行符。

如果fgets()讲到一个换行符,会把它储存在字符串中,这点与gets()不同,它会丢弃换行符。

第3个参数指明要读入的文件。如果读入从键盘输入的数据,以stdin作为参数。

gets()函数的缺陷,引入fgets()函数相关推荐

  1. gets和fgets函数及其区别,C语言gets和fgets函数详解

    gets和fgets函数及其区别,C语言gets和fgets函数详解 每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的"互联网蠕虫",它在 UNIX 操作系统的 ...

  2. c语言中gets与fgets,gets和fgets函数及其区别,C语言gets和fgets函数详解

    每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的"互联网蠕虫",它在 UNIX 操作系统的 finger 后台程序中使用一个 gets 调用作为它的攻击方式之一. ...

  3. c语言gets()函数与它的替代者fgets()函数

    在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回.如果要读取一行字符串,比如: I love BIT 这种情况,scanf() ...

  4. C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中)

    C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中) 需要引入C 标准库 - <stdio.h> 文章目录 描述 声明 参数 返回值 实例 测试(确实只能读n-1个 ...

  5. [C] zintrin.h: 智能引入intrinsic函数 V1.01版。改进对Mac OS X的支持,增加INTRIN_WORDSIZE宏...

    新版本-- http://www.cnblogs.com/zyl910/archive/2012/11/07/zintrin_v102.html [C] zintrin.h: 智能引入intrinsi ...

  6. 【C 语言】文件操作 ( 按照文本行的方式读写文件 | fgets 函数 | fputs 函数 )

    文章目录 一.fgets 函数 二.fputs 函数 三.按照文本行的方式写文件 四.按照文本行的方式读文件 一.fgets 函数 fgets 函数 : 从 FILE *stream 指针指向的文件中 ...

  7. Python 3.x 引入了函数注释

    Python 3.x 引入了函数注释,以增强函数的注释功能,下面是一个普通的自定义函数: def dog(name, age, species):return (name, age, species) ...

  8. c语言fgets函数的用法

    fgets()函数用于从文件流中读取一行或指定个数的字符,其原型为:     char * fgets(char * string, int size, FILE * stream); 参数说明: s ...

  9. 在Shell中使用函数文件,引入文件

    需要编写一个较庞大的脚本时,可能会涉及许多函数.变量.这是通常建议将众多的函数.变量放入一个单独的脚本内.这样做的好处很明显,不用担心某个函数.变量是否已经被定义和使用,也不用频繁地定义.清除函数和变 ...

最新文章

  1. 你还在用Swagger?试试这个神器!
  2. poj 1265 Area(pick 定理)
  3. 多线程的使用——模拟线程池的实现(2015-12-02 00:14:59)
  4. python【Matlibplot绘图库】绘制用于学术论文投稿的黑白图片
  5. java feature get_Java ShapeFeature.getLocations方法代码示例
  6. 突然明白了如何看待细枝末节
  7. BlockJUnit4ClassRunner
  8. 小程序和android联调,小程序打开APP指定页面
  9. 软件项目开发流程以及人员职责
  10. 移动端日历插件_小程序日历组件开发教程!
  11. android输入框边框距离,如何更改Android对话框边距(到屏幕边缘的距离)?
  12. 毕业设计 : 题目:基于深度学习的水果识别 设计 开题 技术
  13. 《果然新鲜》电商项目(44)- 利用Logstash自动同步数据库内容到ES
  14. 互联网造车最靠谱的方式是合作
  15. 利用alias自定义快捷命令
  16. Android模拟器检测体系梳理
  17. tl-wdr7300虚拟服务器怎么设置,TP-Link TL-WDR7300路由器无线桥接怎么设置?
  18. 学Java最值得读的10本英文书
  19. 李建忠设计模式之“单一职责”模式
  20. 华为无线学习笔记--WLAN基础配置

热门文章

  1. 算法笔记(六)多尺度特征融合之FPN/PANet
  2. 如何在Verizon FIOS路由器上更改Wi-Fi网络名称(SSID)
  3. 关于直接下载第三方IPA应用分发平台之蒲公英的研究
  4. codeforces E. Sum of Digits
  5. [JavaSE基础笔记]Day10 石头迷阵实现
  6. 用html做完整网页效果
  7. Pytorch创建自己的数据集(图像分割)
  8. NFA到DFA的转化
  9. objectArx --- ADS篇
  10. 安卓adb工具的安装方法