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. 混合云扛起云存储领军大旗
  2. 【记录】 安装qflow on ubuntu 16.04
  3. java通过代码显示特定窗体,如何把这两段代码在一个窗体显示,类似于windows自带的扫雷一样...
  4. Cloud for Customer的第一个显示的work center是怎么加载和渲染的
  5. 电路设计之干扰问题总结与分析
  6. php下拉选项登录_php下拉选项的批量操作的实现代码
  7. 【JEECG技术文档】JEECG online 表单填值规则使用说明
  8. python 获取帮助页_Python-爬取页面内容(涉及urllib、requests、UserAgent、Json等)
  9. 《设计模式之禅》--摘要
  10. SQL里变量的声明以及常用函数举例
  11. listview中getview异步加载网络图片
  12. 2.4 使用ARDUINO控制MC20进行GPS数据的获取和解析
  13. FreeRTOS的HOOK,以及(23)FreeRTOS 空闲任务分析
  14. CXF学习创建WebService
  15. 关于成本核算方法、步骤、成本分析的简单回复
  16. 浏览器中点击链接,跳转qq添加好友的实现方式
  17. hdu 5745 La Vie en rose 2016多校第二场1012
  18. pycharm安装lxml提示ERROR: b'xslt-config' \xb2\xbb\xca\xc7\
  19. 不懂数据库的码农不是好程序员!
  20. OpenCV笔记之六(1)——图像处理之图像变换

热门文章

  1. 数字IC前端设计流程及详细解释
  2. Ubuntu Server 20.04 安装桌面(图形界面) 以及 远程桌面
  3. MPP架构是什么?看这一篇就行了。。
  4. 解决 openstack-nova-scheduler/conductor 开启失败
  5. 计算机视觉方向好中的期刊有哪些?
  6. Win10更改账户类型为标准改不了怎么办
  7. mapper parameterType
  8. 【手动安装Python包】
  9. Ubuntu 18.04 安装RealSense D435教程
  10. 怎么才能快速减去皮下脂肪?