學過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()吧!