C語言中的gets 函式

2022-08-27 21:09:11 字數 1620 閱讀 2254

在c語言中讀取字串有多種方法,比如scanf() 配合%s使用,但是這種方法只能獲取乙個單詞,即遇到空格等空字元就會返回。如果要讀取一行字串,

比如:i love mit

這種情況,scanf()就無能為力了。這時我們最先想到的是用gets()讀取.

c標準庫中的 gets() 函式。

這個函式的定義如下:

char * gets ( char * str );

gets() 函式的形參只有乙個指標。它會從標準輸入流中讀字元到一塊連續的記憶體位址空間中。這塊位址空間的開始位置就是指標 str 指向的位置。當在輸入流中遇到檔案結束符( eof )或者換行符(\n)時,讀取操作結束。當讀入換行符(\n)時,該字元不會被放入那塊連續的位址空間中。在讀取結束時, gets() 會自動在記憶體空間的末尾追加乙個 null 字元。經過上述這些操作,對於程式設計師來說,這個函式得到的就是從標準輸入進來的,以 null 字元結尾的c字串。如果讀入的字元流是一整行的話,行尾的換行符將會被捨去。

gets()函式從標準輸入(鍵盤)讀入一行資料,所謂讀取一行,就是遇到換行符就返回。

gets()函式並不讀取換行符'\n',它會把換行符替換成空字元'\0',作為c語言字串結束的標誌。

gets()函式經常和puts()函式配對使用,puts()函式用於顯示字串,並自動在字串後面新增乙個換行標誌'\n'

gets()函式存在乙個嚴重的缺陷,這個缺陷就是:它不會檢查陣列是否能夠裝的下輸入行:

比如:我們定義了乙個陣列char src[5],這時候我們呼叫gets(src),來從標準輸入讀取字串,我們看到gets()函式的引數為陣列名,我們都知道,陣列名就相當於乙個指標,也就是陣列的首位址。這時如果我們的輸入大於5個字元,比如 i love mit, gets()函式會從src所指位址開始,依次填入每個字元,但是src只分配了5個位元組的空間,填滿這五個空間後,gets()函式就會訪問未被分配的記憶體空間,如果這片空間已經存有資料,這時程式就會發生錯誤,而中斷。

雖然 gets() 函式早就被公認為不安全的,但是它仍然存在於 c89 和 c99 標準,並最終在 c2011 標準中移除了。但這僅僅是在語言標準中的移除,當我檢查自己的一些**時,發現仍有地方用到了它。

除了gets(),那我們還可以用什麼來代替它的功能呢?

c11標準新增了gets_s()函式可以代替gets()函式,但是,該函式是stdio.h輸入輸出函式系類中的可選擴充套件,因此,即使編譯器支援c11標準,也有可能不支援gets_s()函式。

其實我們可以用c語言中的fgets()函式來代替gets()

我們先看一下函式原型宣告:

char *fgets(char *buf, int bufsize, file *stream);

注意一下第二個引數bufsize,這個引數就限制了讀取的字元的個數,這就可以解決gets()函式的缺陷。

我們知道fgets() 函式主要用於讀取檔案,如果要讀取鍵盤,則stream引數應該為stdin,

需要注意的是,如果bufsize設定為n,那麼fgets()函式最多讀取n-1個字元,之所以用「最多」這個詞是因為,如果在之前遇到了換行符,fgets函式也會返回。

還有一點就是,fgets()函式會讀取換行符(這一點和gets函式不同),當讀取結束後,fgets函式會為buf在末尾新增乙個空字元作為字串的結束。

gets函式,C語言gets函式詳解

在前面從鍵盤輸入字串是使用 scanf 和 s。其實還有更簡單的方法,即使用 gets 函式。該函式的原型為 include char gets char str 這個函式很簡單,只有乙個引數。引數型別為 char 型,即 str 可以是乙個字元指標變數名,也可以是乙個字元陣列名。gets 函式的功...

C語言gets 和get s 函式

介紹 gets 可以無限讀取,易發生溢位。如果溢位,多出來的字元將被寫入到堆疊中,這就覆蓋了堆疊原先的內容,破壞乙個或多個不相關變數的值,由於可以無限讀取,所以在2011年12月,ansi 採納了 iso iec 9899 2011 標準,標準中刪除了 gets 函式,使用乙個新的更安全的函式get...

C語言 gets函式

字串簡介 i am a liitle cat 字串通常以字元陣列的形式儲存在計算機中,並且以 0作為字串結束的標誌 通常用來告知計算機內部是字串形式 與 有所不同 例如 m 是以char 型別基礎變數儲存在計算機中,而 m 是以字元陣列的形式儲存在計算機中 字串輸入函式gets gets 函式從標準...