在程式設計中發現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會指定大小,如果超出陣列大小,會自動根據定義陣列的長度...