学过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()吧!