c語言中get()函式的原理及返回值
這是因為gets()函式不檢查目標陣列是否能夠容納輸入,而若想把一個字串讀到程式中,最先要做的事情就是預留儲存字串的空間。所以這很容易導致分配的空間不夠大而陣列越界,然而gets()函式並不檢查這個方面,所以導致的結果就是程式很容易出現漏洞,著名的“蠕蟲”病毒的原理就是用很長的資料覆蓋原有資料導致崩潰。所以對於重要的程式設計,永遠不要使用gets()!
1, gets()的引數是一個地址,因為要把從鍵盤輸入的值確定的放到某一塊記憶體中,所以需要指定它的地址,而通常使用gets(陣列名)這種方式來把輸入的字串傳入給定的陣列中。注意:這個陣列的大小一定要事先定義好!若不將陣列的大小定義好,就有可能在輸入的時候不知道把字串輸入到哪塊記憶體中去了,就有可能會導致對該記憶體中原始碼的覆蓋。
2, gets()的第一個用法:直接用gets(array's name);這種方式時,由於不知道什麼時候才會到字串結尾,所以每當鍵入'\n', gets()函式都會自動讀取換行符前面的所有內容並且在末尾加上'\0',並且直接把這個字串返回給呼叫它的程式,然後gets()再進行讀取並且會把讀取到的'\n'丟棄,這樣下一次讀取就會在新的一行開始。
例1:
#include <stdio.h> #include <stdlib.h> #define MAX 81 int main(void) { char name[MAX]; printf("Hi, what's your name?\n"); gets(name); printf("Nice name, %s\n", name); return 0; } /* Hi, what's your name? Herry potter Nice name, Herry potter */
3, gets()的原型: char * gets(char * s)
{
...
return s;
}
所以由此可以看出gets()返回的是一個指向char型別資料的指標,而且這個指標與傳遞給他的是同一個指標。因此有如下程式:
例2:
#include <stdio.h> #include <stdlib.h> #define MAX 81 int main(void) { char name[MAX]; char * ptr; printf("Hi,what's your name?\n"); ptr = gets(name); // 這裡的ptr是char型別的指標,此時ptr指向的是name的首地址。 printf("%s? Ah? %s!", name, ptr); // 此時輸出name和ptr指向的值,可以發現,他們的輸出結果都一樣。 return 0; } /* Hi,what's your name? Herry Herry? Ah? Herry! */
4, 實際上gets()有兩種可能的返回值型別:
1)當程式正常輸入字串時:返回讀入字串的地址,也就是字串存放的陣列的首地址;
2)當程式出現錯誤或者遇到檔案結尾時:返回空指標NULL,注意不要弄混空指標和空字元('\0');所以可以很方便的用如下形式檢測錯誤:
while(gets(name) != NULL)
注意:現在基本上不使用gets(),可以說它是一個已經被廢棄的函式,現在可以用scanf(), getchar(), fgets()來代替它。