字元數組 的英文名字是 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/chenmingjunCopyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】