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

比如:I love MIT

这种情况,scanf()就无能为力了。这时我们最先想到的是用gets()读取.

C标准库中的 gets() 函数。

这个函数的定义如下:

char * gets ( char * str );

gets() 函数的形参只有一个指针。它会从标准输入流中读字符到一块连续的内存地址空间中。这块地址空间的开始位置就是指针 str 指向的位置。当在输入流中遇到文件结束符( EOF )或者换行符(\n)时,读取操作结束。当读入换行符(\n)时,该字符不会被放入那块连续的地址空间中。在读取结束时, gets() 会自动在内存空间的末尾追加一个 NULL 字符。经过上述这些操作,对于程序员来说,这个函数得到的就是从标准输入进来的,以 NULL 字符结尾的C字符串。如果读入的字符流是一整行的话,行尾的换行符将会被舍去。

gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回。

gets()函数并不读取换行符'\n',它会把换行符替换成空字符'\0',作为c语言字符串结束的标志。

gets()函数经常和puts()函数配对使用,puts()函数用于显示字符串,并自动在字符串后面添加一个换行标志'\n'

gets()函数存在一个严重的缺陷,这个缺陷就是:它不会检查数组是否能够装的下输入行:

比如:

我们定义了一个数组char src[5],这时候我们调用gets(src),来从标准输入读取字符串,我们看到gets()函数的参数为数组名,我们都知道,数组名就相当于一个指针,也就是数组的首地址。这时如果我们的输入大于5个字符,比如 I love MIT, gets()函数会从src所指地址开始,依次填入每个字符,但是src只分配了5个字节的空间,填满这五个空间后,gets()函数就会访问未被分配的内存空间,如果这片空间已经存有数据,这时程序就会发生错误,而中断。

虽然 gets() 函数早就被公认为不安全的,但是它仍然存在于 C89 和 C99 标准,并最终在 C2011 标准中移除了。但这仅仅是在语言标准中的移除,当我检查自己的一些代码时,发现仍有地方用到了它。

除了gets(),那我们还可以用什么来代替它的功能呢?

C11标准新增了gets_s()函数可以代替gets()函数,但是,该函数是stdio.h输入输出函数系类中的可选扩展,因此,即使编译器支持C11标准,也有可能不支持gets_s()函数。

其实我们可以用c语言中的fgets()函数来代替gets()

我们先看一下函数原型声明:

char *fgets(char *buf, int bufsize, FILE *stream);

注意一下第二个参数bufsize,这个参数就限制了读取的字符的个数,这就可以解决gets()函数的缺陷。

我们知道fgets() 函数主要用于读取文件,如果要读取键盘,则stream参数应该为stdin,

需要注意的是,如果bufsize设置为n,那么fgets()函数最多读取n-1个字符,之所以用“最多”这个词是因为,如果在之前遇到了换行符,fgets函数也会返回。

还有一点就是,fgets()函数会读取换行符(这一点和gets函数不同),当读取结束后,fgets函数会为buf在末尾添加一个空字符作为字符串的结束。

来源:https://www.cnblogs.com/zhaoyunt/p/13082534.html

c语言里面gets(a)是什么意思,C语言中的gets()函数相关推荐

  1. c语言使用free释放指针报错,C语言中的free函数用法执行机制分析

    free函数是C语言或者C++程序语言的常用函数,那么free函数有什么用途呢?free函数又怎么用呢?C语言中的free函数用法执行机制分析,一起来看看free内部的机制以及和delete的对比分析 ...

  2. 【C语言进阶深度学习记录】九 C语言中const的详细分析

    文章目录 1 const的分析 2 const本质的分析实验 2.1 代码案例分析 3 const修饰函数参数和返回值时的情况 3.1 代码案例分析 4 总结 1 const的分析 不管是C语言还是C ...

  3. main c语言中变量的定义,C语言中在main函数中定义的变量是全局变量么_后端开发...

    PHP 和 JavaSript 区别_后端开发 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高 ...

  4. C语言定义变量用什么字母,C语言中变量名有什么要求 C语言中,什么是变量和变量名?它们的区别是什么?...

    导航:网站首页 > C语言中变量名有什么要求 C语言中,什么是变量和变量名?它们的区别是什么? C语言中变量名有什么要求 C语言中,什么是变量和变量名?它们的区别是什么? 相关问题: 匿名网友: ...

  5. C语言 SLEEP函数不起作用,C语言中的sleep() 函数 sleep函数的具体用法

    导航:网站首页 > C语言中的sleep() 函数 sleep函数的具体用法 C语言中的sleep() 函数 sleep函数的具体用法 相关问题: 匿名网友: 关于sleep()函数在windo ...

  6. c语言其他函数调用main函数,C语言中的main函数以及main函数是如何被调用的

    main函数是C语言中比较特殊的函数,C程序总是从main函数开始执行,main函数的原型是: int main(int argc, char *argv[]); 其中argc是命令行参数的个数,ar ...

  7. c语言fputc 函数头,简单对比C语言中的fputs()函数和fputc()函数

    简单对比C语言中的fputs()函数和fputc()函数 C语言fputc()函数:写文件函数(将一指定字符写入文件流中) 头文件: #include 定义函数: int fputc(int c, F ...

  8. c语言自动生成系统时间函数,使用C语言中的time函数获取系统时间

    使用C语言中的time函数获取系统时间 可以通过time()函数来获得计算机系统当前的日历时间(Calendar Time),处理日期时间的函数都是以本函数的返回值为基础进行运算.其原型为: time ...

  9. c语言 system(quot;pausequot;);,pause什么意思_C语言中system(quot;pausequot;)是什么作用和意...

    C语言中system("pause")是什么作用和意思 从程序中发起系统命令行调用,执行命令:pause. 作用和效果就是dos下的pause. system("PAUS ...

最新文章

  1. python tensor_Python深度学习 2.3 张量运算
  2. Apache遇到的问题:APR not found
  3. maven_Maven排除所有传递依赖项
  4. linux平台下 延迟工作队列实例
  5. Python入门二(1)
  6. Qt 如何发送和接收UDP数据报
  7. ITK:提取具有多个分量的图像通道
  8. 步入三十岁前的总结:看似经历很多得到很多,但,实际却一无所得
  9. 机床使用教学_辽宁高校学子前往凤城市,进行与数控机床相关的专业实践活动...
  10. iPhone 12售价再曝光,可能涨价50美元
  11. 基坑监测日报模板_深基坑支护施工安全技术措施
  12. 从主机名谈Hadoop集群管理
  13. 【EOS】EOS环境基础
  14. sublime python调试_如何用sublime调试程序
  15. python(九):函数、匿名函数 lambda
  16. Ubuntu16.04安装为知笔记(WizNote)
  17. HTG评论Yoga Tablet 2 Pro:内置Pico投影仪可延长电池寿命
  18. mysql仿网易评论_仿网易新闻客户端评论盖楼
  19. CST软件基本操作—3
  20. 如何更改微信小程序二维码物料颜色

热门文章

  1. 校赛 问题 F: 传送门(Dijkstra算法)
  2. 这能忍?阿里、京东、腾讯、百度联合出手了!!
  3. 乘法逆元的三种求解方法
  4. SEO人员,如何打好免费流量与付费流量的组合拳?
  5. 指数移动平均值(exponential moving average)常用于平滑曲线
  6. 微信小程序多图上传/朋友圈传图效果【附完整源码】
  7. EXCEL中批量计算“已知一点坐标、方位角、距离,求坐标点”
  8. 泰山OFFICE技术讲座:页面空白(页边距)是怎么算的
  9. 黄帝81难经1-10难
  10. 2017年九月计算机试题,2017年九月份全国计算机一级考试试题