轉載自CSDN博客:http://blog.csdn.net/shenglanya/article/details/52213500
首先要記住的一句話就是Never use gets().
這是因為gets()函數不檢查目標數組是否能夠容納輸入,而若想把一個字符串讀到程序中,最先要做的事情就是預留存儲字符串的空間。所以這很容易導致分配的空間不夠大而數組越界,然而gets()函數並不檢查這個方面,所以導致的結果就是程序很容易出現漏洞,著名的“蠕蟲”病毒的原理就是用很長的數據覆蓋原有數據導致崩潰。所以對於重要的編程,永遠不要使用gets()!
1, gets()的參數是一個地址,因為要把從鍵盤輸入的值確定的放到某一塊內存中,所以需要指定它的地址,而通常使用gets(數組名)這種方式來把輸入的字符串傳入給定的數組中。注意:這個數組的大小一定要事先定義好!若不將數組的大小定義好,就有可能在輸入的時候不知道把字符串輸入到哪塊內存中去了,就有可能會導致對該內存中原代碼的覆蓋。
2, gets()的第一個用法:直接用gets(array's name);這種方式時,由於不知道什么時候才會到字符串結尾,所以每當鍵入'\n', gets()函數都會自動讀取換行符前面的所有內容並且在末尾加上'\0',並且直接把這個字符串返回給調用它的程序,然后gets()再進行讀取並且會把讀取到的'\n'丟棄,這樣下一次讀取就會在新的一行開始。
例1:
3, gets()的原型: char * gets(char * s)
{
...
return s;
}
所以由此可以看出gets()返回的是一個指向char類型數據的指針,而且這個指針與傳遞給他的是同一個指針。因此有如下程序:
例2:
4, 實際上gets()有兩種可能的返回值類型:
1)當程序正常輸入字符串時:返回讀入字符串的地址,也就是字符串存放的數組的首地址;
2)當程序出現錯誤或者遇到文件結尾時:返回空指針NULL,注意不要弄混空指針和空字符('\0');
所以可以很方便的用如下形式檢測錯誤:
while(gets(name) != NULL)
注意:現在基本上不使用gets(),可以說它是一個已經被廢棄的函數,現在可以用scanf(), getchar(), fgets()來代替它。
