fgets/gets,fputs/puts區別
最近用vim修改檔案後,總會自動在結尾新增字元,簡直蒙了。
遇到一個gets緩衝區溢位的問題,查詢之後才發現gets並非保證以'\0'結束。所以乾脆記錄一下。
1. gets與fgets
gets函式原型:char*gets(char*buffer);//讀取字元到陣列:gets(str);str為陣列名。
gets函式功能:從鍵盤上輸入字元,直至接受到換行符或EOF時停止,並將讀取的
結果存放在buffer指標所指向的字元陣列中。讀取的換行符被轉換為'\0'值,
作為字元陣列的最後一個字元,來結束字串。
注意:gets函式由於沒有指定輸入字元大小,所以會無限讀取,一旦輸入的字元大於陣列長度,就會發生修改越界,從而造成程式崩潰或其他資料的錯誤。
fgets函式原型:char *fgets(char *s, int n, FILE *stream);
fgets函式功能:從檔案指標stream中讀取字元,存到以s為起始地址的空間裡,直到讀N-1個字元,或者讀完一行。
注意:呼叫fgets函式時,最多隻能讀入n-1個字元。讀入結束後,系統將自動在最後加'\0',並以str作為函式值返回。
區別:
fgets視換行符'\n'為普通字元。
比如緩衝區char buff[6],如果我們輸入"fuck"並換行
那麼程式讀入5個字元並新增\0,恰好能填充buff,記憶體為fuck\n\0。
如果我們輸入fuckoff,並敲擊換行,那麼程式讀入fucko,並新增\0。
gets視'\n'為'\0'。
比如緩衝區char buff[6],如果我們輸入"fuck"並換行。你將得到fuck\0
如果輸入fuckoff,記憶體將是fuckof。
2. puts與fputs
puts會自動換行,fputs不會。
這個結論應該是明顯的,因為如果你用fgets接受換行符並用fputs輸出,憑什麼還要加個換行呢?