您的位置:首页 > 其它

由GCC中使用gets得到的warning,探究gets、scanf和fgets的用法区别

2018-07-16 16:01 816 查看

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'。切记切记。

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: