由GCC中使用gets得到的warning,探究gets、scanf和fgets的用法区别_gcc fgets_霸王兔的博客-程序员秘密

技术标签: C语言  

GCC的编译检查出了名的严格,在使用gets()时出现warning :

a2.c:6:5: warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]

  gets(a);
  ^
/tmp/cceyMQ7u.o: In function `main':

 

a2.c:(.text+0x41): warning: the `gets' function is dangerous and should not be used.

 

引起我的注意,遂问之网络,终得到答案。

gets()

gets()从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

特点:可读入空格和TAB,但只能以字符型数据读取,不含回车

注意:gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值,为了避免这种情况,我们可以用fgets()来替换gets()(在linux下,程序中用gets(),编译会有warning:the `gets' function is dangerous and should not beused)。

scanf()

scanf("%s",&s)与gets(s)函数相似,但不完全相同,使用scanf("%s",&s)函数输入字符串时存在一个问题,就是如果输入了空格、回车或者Tab会认为字符串结束,后面的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。特别注意,输入回车分隔的多个字符串时,回车会放在输入缓冲区,作为下一次的输入,所以可以配合getchar()吞掉回车符。

特点:可以指定读取数据类型,但不能存在空格和TAB,不含回车

注意:和gets一样

fgets()

 

fgets函数既可以用来从文件中读入字符串,也可以从屏幕上输入一字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针(此参数写成stdin即从屏幕取词);str是存放在字符串的起始地址;n是一个int类型变量,表示读取字符串字符的最大数量,函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作。

特点:读入的字符串中最后包含读到的换行符(这就是为什么第二个参数是n,而最多只能读入n-1个字符的原因,这个地方一定要注意),如下代码:

int len;

char str[128];

fgets(str,128,stdin);

len = strlen(str);

printf("len= %d\n", len);

如果是在标准输入里输入abcd回车

输出结果是:5而不是4。

所以在需要用到字符串长度的时候要特别注意下。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。在题目要求输入n个字符时,应设定数组长度至少n+2,尤其注意读入字符数也是n+2,即包含结尾回车'\n'和结束符'\0'。切记切记。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bawangtu/article/details/81066410

智能推荐

Example of @EnableAsync and @Async in Spring_清风2556的博客-程序员秘密

Home  >  Spring CoreExample of @EnableAsync and @Async in SpringBy Arvind Rai, March 22, 2013In spring to run asynchronous method, @EnableAsync is used with @Configuration. To ru

对抗神经网络(二)——DCGAN_dcgan网络结构_全部梭哈一夜暴富的博客-程序员秘密

一、DCGAN介绍DCGAN即使用卷积网络的对抗网络,其原理和GAN一样,只是把CNN卷积技术用于GAN模式的网络里,G(生成器)网在生成数据时,使用反卷积的重构技术来重构原始图片。D(判别器)网用卷积技术来识别图片特征,进而做出判别。同时,CDGAN中的卷积神经网络也做了一些结构的改变,以提高样本的质量和收敛速度。DCGAN的generator网络结构图如下:G网中使用ReLU作...

关于bootstrap upload url传输参数问题_Vijay小白的博客-程序员秘密

bootstrap upload配置如下:$("#input-1").fileinput({//这里的id是input标签的id      uploadUrl: '/appr/upload/doFileUpload.do',    uploadAsync: true,    uploadExtraData:{                 $("#b").val() 

谱聚类算法原理介绍_resourse_sharing的博客-程序员秘密

1. 谱聚类给你博客园上若干个博客,让你将它们分成K类,你会怎样做?想必有很多方法,本文要介绍的是其中的一种——谱聚类。聚类的直观解释是根据样本间相似度,将它们分成不同组。谱聚类的思想是将样本看作顶点,样本间的相似度看作带权的边,从而将聚类问题转为图分割问题:找到一种图分割的方法使得连接不同组的边的权重尽可能低(这意味着组间相似度要尽可能低),组内的边的权重尽可能高(这意味着组内相似度要尽

Android JAVA中去掉字符串空格的方法_安卓有通过空格的截取_haozidao的博客-程序员秘密

1. String.trim()    trim()是去掉首尾空格         2.str.replace(" ", ""); 去掉所有空格,包括首尾、中间    String str = " hell o ";  String str2 = str.replaceAll(" ", "");  System.out.println(str2);   

frp启动报错“[W] [control.go:113] login to server failed: EOF”_frp login to server failed_奔狼的春晓的博客-程序员秘密

内网穿透一直用的frp,在公网的阿里云搭建了一个frp的server,一直用的挺好,最近有个新设备上也要内网穿透,于是装了frpc,没想到启动报错了 启动命令: /home/unierm/frp/frpc -c /home/unierm/frp/frpc.ini报错:2018/08/31 15:00:36 [I] [proxy_manager.go:300] proxy r...

随便推点

UFO又有新的动作了,美国公布了UFO和POKERTIME129263又有许多新的动作超出了地球人的认知范围_pokertimeVpkt899的博客-程序员秘密

美国时间25日发布了一份报告,公开了美国就不明飞行物(UFO)掌握的信息。报告部分内容来自2020年8月成立的一支由海军主导的特别工作组撰写。这份由美国家情报局长办公室发布的报告显示,自2004年以来,美国防部共记录了144起UFO目击事件,报告对其中一起事件给出的原因是出现了“空中杂波”,至于其余143起事件则均未给出具体解释。报告还用不明航空现象(UAP)替换了扑克时间联盟1888先前不明飞行物(UFO)的提法。报告称,美国防和情报分析人员缺乏足够数据来确定这些不明飞行物的性质。一位美国高级官员

一个程序员的职业生涯到底该怎么规划?_程序员1到3年职业规划_重庆千锋的博客-程序员秘密

一个程序员的职业生涯到底该怎么规划?首先我们都知道,一个职业想做到精,做到“很有钱”,都是通过步步“进化”而来的。今天我们就说说这个“进化”步骤。走进你的未来第一阶段(2-3年)初级程序员,月薪6k-10k。在“进化”门口的你,刚从学校或培训班毕业,大多迷茫。对这份工作兴趣浓厚,对未来憧憬,动力十足。但每天面对着密密麻麻的代码,总会心生厌倦,加之市场上程序员的工作看似已饱和。更会让初出茅庐的...

easyui datetimebox setvalue 设置值_mingjie1212的博客-程序员秘密

从官网上知道,设置datetimebox 的值的方式是setValue:如下:setValuevalueSet the datetimebox value.Code example:$('#dt').datetimebox('setValue', '6/1/2012 12:30:56'); // set datetimebox valuev

C++中vector的用法_vector<int>sort,并存储idx值_Cheery_Jiang的博客-程序员秘密

vector是C++标准模板库STL中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。为了可以使用vector,必须在你的头文件中包含下面的代码:

ChromeBook安装Ubuntu中文乱码问题_番茄大圣的博客-程序员秘密

最近买了个ChromeBook Dell Candy,主要是看中它长续航,低价格,小巧,使用Crouton安装Ubuntu整成双系统,符合我每天工作之余只浏览网页和写写测试代码的需求,买回来用了段时间了,各方面都很满意,咔咔咔~ 今天在Ubuntu上浏览网页发现中文全是乱码,本想着轻松就可以搞定的,没想到搞了半天才搞明白,所以在这里记录一下,免得以后用到又浪费不少时间。 实际上使用Crouton