fget 和 gets之間的區別

2021-08-26 15:28:21 字數 1202 閱讀 2256

在程式設計中發現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)){

gets和scanf的區別。

寫乙個函式,輸入乙個十六進製制數,輸出相應的是進製數。程式設計如下 include include include void main char t 20 c long htoi char doprintf ninput a hex number gets t printf decimal numb...

fgets和gets的區別

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

scanf和gets的區別

gets函式可以一次接收一行輸入串,其中可以有空格,也就是說空格可以做為字串的一部分輸入.而scanf函式接收的字串不會含有空格,即遇到字空格時,認為字串輸入結束,也就是說空格是scanf預設的結束符號。scanf和gets不能混合使用,如果乙個程式中用scanf的話,一般不能再用gets,反之亦然...