0%

Linux 系统中,gets函数出错

其实这是在很早之前就遇到的问题,这样一个简单的程序

1
2
3
4
5
6
7
#include<stdio.h>
int main()
{
char str[100];
gets(str);
printf("%s\n",str);
}

解决办法

在Linux中使用gcc编译这段代码的时候,出现如下错误

1
2
3
4
5
warning: 'gets' is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
gets(str);
^
/tmp/ccf5cnfv.o: In function `main':
test.c:(.text+0x10): warning: the `gets' function is dangerous and should not be used.

最后一行说了,gets函数是危险的,不应该被使用。
当初人比较二的时候,用了这样一个办法,发在了博客园。
现在感觉有诸多漏洞,还是补一下比较好。
求助google,在stackoverflow找到了解决办法
这样做

1
2
3
4
5
6
7
#include<stdio.h>
int main()
{
char str[100];
fgets(str,100,stdin );
printf("%s\n",str);
}

使用fgets函数来代替gets函数,但是实际上这里仍然有局限性,fgets函数中的第二个参数限制了能输入的字符数目,似乎我比较二的时候,想出来的解决办法更好呢^_^

原因说明

If you have code like this:

1
2
char s[10];
gets( s );

and you type in more than 10 characters when the program is run, you will overflow the buffer, causing undefined behaviour. The gets() function has no means of preventing you typing the characters and so should be avoided. Instead you should use fgets(), which allows you to limit the number of characters read, so that the buffer does not overflow.:

1
2
char s[10];
fgets( s, 10, stdin );

The puts() function is perfectly safe, provided the string that you are outputting is null-terminated.
不想用机翻的来给你看,将就一下 =_=

生命重在折腾