gets和fgets函式的區別

2021-07-26 04:11:09 字數 2414 閱讀 8759

gets函式原型:char*gets(char*buffer);//讀取字元到陣列:gets(str);str為陣列名。

gets函式功能:從鍵盤上輸入字元,直至接受到換行符或eof時停止,並將讀取的結果存放在buffer指標所指向的字元陣列中。

讀取的換行符被轉換為null值,做為字元陣列的最後乙個字元,來結束字串。

注意:gets函式由於沒有指定輸入字元大小,所以會無限讀取,一旦輸入的字元大於陣列長度,就會發生記憶體越界,

從而造成程式崩潰或其他資料的錯誤。

fgets函式原型:char *fgets(char *s, int n, file *stream);//我們平時可以這麼使用:fgets(str, sizeof(str), stdin);

其中str為陣列首位址,sizeof(str)為陣列大小,stdin表示我們從鍵盤輸入資料。

fgets函式功能:從檔案指標stream中讀取字元,存到以s為起始位址的空間裡,知道讀完n-1個字元,或者讀完一行。

注意:呼叫fgets函式時,最多只能讀入n-1個字元。讀入結束後,系統將自動在最後加'\0',並以str作為函式值返回。

1,上面說到gets函式無限讀取,沒有上限。但是有些資料介紹說它最多只能讀取1024個,所以我寫了下面**測試一下

(有興趣的朋友可以測試一下(●'◡'●))

1

//測試gets最多讀取字元是否超過1024

2 #include 3 #include 45

intmain()

6

經本人親自測試第一次cnt = 2003,第二次cnt = 2086,第二次程式最後崩潰了,但是不能說明gets的讀取上限為2086左右,

因為程式崩潰是由於記憶體越界

2,在來細說一下fgeis的用法,我們以char str[n];fgets(str, n, stdin);為例:

fgets只能讀取n-1個字元,包括最後的'\n',讀完結束後系統將自動在最後加'\0'(gets讀完結束後系統自動會將'\n'置換成'\0')。

說到這裡就有倆種情況了:

一:當你從鍵盤上輸入<=n-1個字元(包括'\n')時,那麼字串str會以『\n\0』結尾。這就造成了strlen(str)比你想象的大 1 ,

當然你可以通過下面**將'\n'去掉。

1

if(str[strlen(str) - 1] == '

\n')

二:當你從鍵盤上輸n-1個字元(包括'\n')時,那麼字串str會以'\0'結尾。

3,在上面我們提到從鍵盤輸入字元大於n的情況,這時gets和fgets就又有一些區別了,我們通過以下**來測試一下:

1 #include 2 #include 

3#define n 545

intmain()614

15//

fflush(stdin);

//清空緩衝區

當我們輸入12345按下回車,直接就出來1234 5這樣的結果。是不是與我們預想的不一樣呢?我們單看結果,s1是1234,

s2是5。這是為什麼呢?

這就是fgets與gets的不同之處,我們第乙個fgets只讀取了1234,將5'\n'放入緩衝區中,當程式執行到第二個fgets時,

它就會直接從緩衝區讀取,直到遇到'\n'結束所以就會有這樣的結果,此時s1是1234'\0',s2是5'\0'.我們應該怎麼解決這種問題呢?

我們可以在第二個fgets前加一句fflush(stdin),它是清除緩衝區的作用,大家可以試試,我就不截圖了。

上面我們是用fgets輸入的,現在我們換成gets來輸入,看看結果吧:

說到這裡就已經不是簡單的gets與fgets的問題了,這涉及到了我們從鍵盤讀入的資料在記憶體中是怎麼顯示的了,所以我只簡單的說一下。

在記憶體中s1是這樣排序的

'\0'

6   54 

3 2 

1當s2輸入進來的時候會變成:

'\0'65

43'\0'fe

dcba

所以輸出的時候就會s1輸出f,後遇'\0'結束,s2輸出abcdef,後遇'\0'結束。

fgets 和gets 函式的區別

在程式設計中發現gets和fgets一些區別總結一下 1 fgets比gets安全!為了安全,gets少用,因為其沒有指定輸入字元的大小,限制輸入緩衝區得大小,如果輸入的字元大於定義的陣列長度,會發生記憶體越界,堆疊溢位。後果非常嚴重!fgets會指定大小,如果超出陣列大小,會自動根據定義陣列的長度...

fgets 和gets 函式的區別

在程式設計中發現gets和fgets一些區別總結一下 1 fgets比gets安全!為了安全,gets少用,因為其沒有指定輸入字元的大小,限制輸入緩衝區得大小,如果輸入的字元大於定義的陣列長度,會發生記憶體越界,堆疊溢位。後果非常嚴重!fgets會指定大小,如果超出陣列大小,會自動根據定義陣列的長度...

fgets和gets函式的區別

gets函式原型 char gets char buffer 讀取字元到陣列 gets str str為陣列名。gets函式功能 從鍵盤上輸入字元,直至接受到換行符或eof時停止,並將讀取的結果存放在buffer指標所指向的字元陣列中。讀取的換行符被轉換為null值,做為字元陣列的最後乙個字元,來結...