【C】你还在用gets()吗?

  学过C的都知道gets()函数是用来接收字符串的一个函数,以前用的时候感觉挺好使的,但是今天碰到了一个问题。

  本人写的程序如下:

1 #include <stdio.h>
2 int main(void)
3 {
4     char name[10];
5     gets(name);
6     puts(name);
7 }

  这个程序最简单不过了,就是一个字符串输出输入的问题,但是使用linux下的gcc编译老是不能通过,提示的问题是:

  “the 'gets' function is dangerous and shout not be used.

  让我很纠结,为什么这个函数不让使用,它怎么就危险了?

  然后我又查阅了linux C函数库之后就明白了。书上为这个函数附加了一条说明:“由于gets()无法知道字符串的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓存溢出的安全性问题。建议使用fgets()取代。

  原来gcc为了安全考虑就直接把gets()函数的使用权给取消了。下面是net小伙用windows下的vc编译的一个小程序,来说明gets()究竟有什么危害。

  程序如下:

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     char a;
 5     char name[3];
 6     char b;
 7     scanf("%c",&a);
 8     printf("a:%c\n",a);            //第一次输出a的值
 9     getchar();
10     gets(name);
11     scanf("%c",&b);                
12     printf("name:%s;\na:%c;\nb:%c;\n",name,a,b);    //输出所有的值,注意a
13 }

我们来测试一下这个程序,运行结果如下:

输入的字符串是abc,正好达到了预期的效果。我们增加字符串的长度,然后再测试一下看看有什么效果:

由于我们把字符串改成了“this is a text”

然后a的值莫名其妙的被替换了。紧接着编译器不能正常工作了。

在不正确使用gets()函数的时候造成的危害是很大的,就像我们刚才看到的那样,a的值被字符串name溢出的值给替换了。我想这并不是你想要的结果吧!出于安全,用fgets()来代替gets()吧!

 

posted @ 2012-11-26 17:25  net小伙  阅读(34158)  评论(12编辑  收藏  举报