天天看點

linux系統下,警告:warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration] 和 warning: the `gets' function is dangerous and should

字元數組 的英文名字是 char []

gets()函數的基本用法為:

char *gets(char *s);

該函數的參數是一個字元數組,該函數的傳回值也是一個字元數組。

linux下的代碼如下:

1 #include <stdio.h>

2

3 int main()

4 {

5    char a[100] = { 0 };

6    gets(a);

7    printf("%s\n", a);

8    return 0;

9 }

-----------------------------------------------------------------------------

編譯時會出現一個warning,建議我們不要使用gets函數了。我們暫時不管他,先直接運作看結果。

--------------------------------------

警告如下:

a2.c:6:5: warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]

  gets(a);

  ^

/tmp/cceyMQ7u.o: In function `main':

a2.c:(.text+0x41): warning: the `gets' function is dangerous and should not be used.

原因:

問題出在程式中使用了 gets是非常不安全的。這是對程式産生BUG,出現不可靠性的一個描述,有些函數在某些意外情況會導緻程式陷入不可控狀态,僅僅是PC上運作最多也就是退出而已,但是如果是運作在飛機等系統裡的話,就會有大麻煩,說危險也不為過。因為英文文獻裡描述為dangerous,是以也就翻譯為危險。

函數執行需要一個棧空間,但這個棧空間容量是有限的,而且棧裡存放了函數傳回的位址。gets()函數在擷取輸入時,如果無限輸入會造成棧空間溢出,在程式傳回時,不能正常的找到傳回位址,程式将發生不可預測行為。

解決:

解決辦法是使用 fgets,但由于fgets函數是為讀取檔案設計的,是以讀取鍵盤是沒有gets那麼友善。

fgets()函數的基本用法為:

fgets(char *s, int size, FILE *stream);

第一個參數是:字元類型的數組,第二個參數是:标明這個數組的大小,第三個參數是:如果總是通過鍵盤輸入的話,可以固定寫為stdin。

示例程式:

/*代碼實作01_使用fputs函數列印輸出*/

#include <stdio.h>

int main ( ) {

  char name[20] = { 0 };

  fgets(name, sizeof(name), stdin); //stdin 意思是鍵盤輸入

  fputs(name, stdout); //stdout 意思是通過列印裝置輸出

  return 0;

}

/*代碼實作02_使用printf函數列印輸出*/

  printf("%s", name); //這邊輸出不需要 \n 了,實際操作時,fgets會認為使用者輸入的回車也是字元串的一部分内容。即輸出的内容中間接地帶了 \n 了。

fgets會認為使用者輸入的回車也是字元串的一部分内容。

fgets是安全的,不會因為使用者惡意的輸入過長的字元串導緻溢出。因為它隻接受它能存的最大的字元數,其餘的舍掉!

我的GitHub位址:

https://github.com/heizemingjun

我的部落格園位址:

http://www.cnblogs.com/chenmingjun

我的螞蟻筆記部落格位址:

http://blog.leanote.com/chenmingjun

Copyright ©2018 黑澤明軍

【轉載文章務必保留出處和署名,謝謝!】

繼續閱讀