gets函数不得不说的危机

在写代码时我们要从键盘输入不同的指令,这就要用到相关的输入函数,下面我们来看看基本输入函数的特点
我们现在常用的基本输入函数是scanf和gets,今天我们来说说它们。

  1. scanf
    最开始大家见到的输入函数一定时scanf函数,它可以实现各种进制的输入,但随着字符串的学习,我们发现一串字符串中含有空格时,scanf就不能接收到用户从键盘上输入的全部的值,如图:
    在这里插入图片描述
    为了实现一串字符的输入,我们学会了gets函数。
  2. gets函数
    它可以实现一串字符串的操作,碰到EOF结束,如图:
    在这里插入图片描述
    可是就在我们使用顺畅的时候,有人说这个gets存在很大的危险性,所以小编就去查了下。
  3. gets的危险性
char * gets ( char * str );//gets函数的原型

我们可以看到gets() 函数的形参只有一个指针。该指针指向的内存空间将用于保存读入数据。但是 gets() 函数无法知道它需要使用多大的内存空间。如果在标准输入中读入足够长的,不包含换行符的字符流,gets() 函数肯定会覆盖掉指定的内存区域,导致我们的数据缺失,这便是最大的危险性。为了避免这个错误,小编推荐使用 fgets函数,下面小编来介绍以下它吧!

  1. fgets函数
char *fgets(char *buf, int bufsize, FILE *stream)//从*stream读取bufsize-1个数据放到*buf

*buf: 字符型指针,指向用来存储所得数据的地址。
bufsize: 整型数据,指明存储数据的大小。
*stream: 文件结构体指针,将要读取的文件流。
从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋’\0’),如果文件中的该行,不足bufsize-1个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回buf,失败或读到文件结尾返回NULL。
与gets相比使用这个好处是:读取指定大小的数据,避免gets函数从键盘接收字符串而不检查它所复制的缓存的容积导致的缓存溢出问题。
推荐使用,下次见!

猜你喜欢

转载自blog.csdn.net/qq_43411555/article/details/84064672