fgets和gets的區別

2021-06-20 06:23:38 字數 1647 閱讀 2937

在程式設計中發現gets

和fgets

一些區別總結一下;

1、 fgets比

gets

安全,使用

gets

編譯時會警告

為了安全,gets

少用,因為其沒有指定輸入字元的大小,限制輸入緩衝區得大小,如果輸入的字元大於定義的陣列長度,會發生記憶體越界,堆疊溢位。後果非常怕怕

fgets會指定大小,如果超出陣列大小,會自動根據定義陣列的長度截斷。(

redhat9.0實驗並不是如此,不知為何

,照樣能輸出)

2、 用strlen

檢測兩者的輸入的字串長度,結果不一樣

可以看到,同樣是輸入123

gets只有一次換行,這是因為程式的語句

printf(「%s\n」,str)

fgets有兩次,而第二次是其本身把回車換行符存入了字串裡

所以,gets

的長度只有

3和輸入的字串長度一樣,

fgets是4

,多出來的是回車換行符。

具體的介紹:

fgets函式

fgets

函式用來從檔案中讀入字串。

fgets

函式的呼叫形式如下:

fgets

(str,n

,fp);此處,

fp是檔案指標;

str是存放在字串的起始位址;

n是乙個

int型別變數。函式的功能是從

fp所指檔案中讀入

n-1個字元放入

str為起始位址的空間內;如果在未讀滿

n-1個字元之時,已讀到乙個換行符或乙個

eof(檔案結束標誌),則結束本次讀操作,讀入的字串中最後包含讀到的換行符。因此,確切地說,呼叫

fgets

函式時,最多只能讀入

n-1個字元。讀入結束後,系統將自動在最後加

'\0'

,並以str

作為函式值返回。

gets()將刪除新行符, 

fgets()

則保留新行符.

要去掉fgets()

最後帶的「

\0",只要用 

s[strlen(s)-1]='\0';

即可。

fgets不會像

gets

那樣自動地去掉結尾的

\n,所以程式中手動將

\n位置處的值變為

\0,代表輸入的結束。

針對於fgets

,還要再說兩句,下面這種用法,

是安全的判斷檔案讀取結束或者出錯的好方式,切忌不能使用while(!feof(fp)) 

,還有對於

fgets

的第二個引數是最大能讀取檔案字元的個數,一般最大的長度是

1024

位元組。while(fgets(..., stream))

if(ferror(stream))

**:

fgets()和gets()的區別

區別如下 1 fgets 函式的第2個引數指明了讀入字元的最大數量。如果該引數的值是n,那麼fgets 將讀入n 1個字元,或者讀到遇到的第乙個換行符為止 2 如果fgets 讀到第乙個換行符,會把它儲存在字串中。這點和gets 不同,gets 會丟棄換行符 3 fgets 函式的第3個引數指明要讀...

fgets 和gets 函式的區別

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

fgets 和gets 函式的區別

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