c語言中get 函式的原理及返回值

2022-09-04 05:06:10 字數 1456 閱讀 8479

**自csdn部落格:

首先要記住的一句話就是never use gets().

這是因為gets()函式不檢查目標陣列是否能夠容納輸入,而若想把乙個字串讀到程式中,最先要做的事情就是預留儲存字串的空間。所以這很容易導致分配的空間不夠大而陣列越界,然而gets()函式並不檢查這個方面,所以導致的結果就是程式很容易出現漏洞,著名的「蠕蟲」病毒的原理就是用很長的資料覆蓋原有資料導致崩潰。所以對於重要的程式設計,永遠不要使用gets()!

1, gets()的引數是乙個位址,因為要把從鍵盤輸入的值確定的放到某一塊記憶體中,所以需要指定它的位址,而通常使用gets(陣列名)這種方式來把輸入的字串傳入給定的陣列中。注意:這個陣列的大小一定要事先定義好!若不將陣列的大小定義好,就有可能在輸入的時候不知道把字串輸入到哪塊記憶體中去了,就有可能會導致對該記憶體中原**的覆蓋。

2,    gets()的第乙個用法:直接用gets(array's name);這種方式時,由於不知道什麼時候才會到字串結尾,所以每當鍵入'\n', gets()函式都會自動讀取換行符前面的所有內容並且在末尾加上'\0',並且直接把這個字串返回給呼叫它的程式,然後gets()再進行讀取並且會把讀取到的'\n'丟棄,這樣下一次讀取就會在新的一行開始。

例1:    

[cpp]view plain

copy

#include 

#include 

#define max 81

intmain(

void

)    

/*hi, what's your name?

herry potter

nice name, herry potter

*/3,  gets()的原型: char * gets(char * s)

所以由此可以看出gets()返回的是乙個指向char型別資料的指標,而且這個指標與傳遞給他的是同乙個指標。因此有如下程式:

例2:[cpp]view plain

copy

#include 

#include 

#define max 81

intmain(

void

)    

/*hi,what's your name?

herry

herry? ah? herry!

*/4, 實際上gets()有兩種可能的返回值型別:

1)當程式正常輸入字串時:返回讀入字串的位址,也就是字串存放的陣列的首位址;

2)當程式出現錯誤或者遇到檔案結尾時:返回空指標null,注意不要弄混空指標和空字元('\0');

所以可以很方便的用如下形式檢測錯誤:

while(gets(name) != null)

注意:現在基本上不使用gets(),可以說它是乙個已經被廢棄的函式,現在可以用scanf(), getchar(), fgets()來代替它。

C語言中的main函式引數及返回值

我們經常看到main函式不帶引數。因此main後都是空括號。main 實際上,main函式必須帶引數,這個引數可以認為是main函式的形式引數。c語言規定main函式的引數只能有兩個,習慣上這兩個引數寫為argc和argv。因此,main函式的函式頭可寫為 main argc,argv c語言還規定...

C語言中scanf 函式的返回值

c語言中簡單的輸入scanf函式和輸出printf函式,我們經常使用,也很熟悉,但有時卻還是會在這兩個地方犯錯。scanf 函式 功 能 執行格式化輸入 用 法 int scanf char format argument,scanf 函式是通用終端格式化輸入函式,它從標準輸入裝置 鍵盤 讀取輸入的...

C語言中函式如何返回處理後的結果?

在c語言中,自動變數在堆疊中分配記憶體,當包含自動變數的函式或 塊退出時,它們所占用的記憶體便被 被 的記憶體可能會被馬上覆蓋,也可能等到很久以後才會被覆蓋,這取決於堆疊中先前的自動變數位於何處,下乙個函式 塊宣告的變數 寫入的內容等條件,所以如果有以下 char func 那麼這個函式會導致乙個難...