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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM