1. 程式人生 > >fgets/gets,fputs/puts區別

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輸出,憑什麼還要加個換行呢?