C語言:gets、puts、fgets、fput、gets_s函數

char *gets(char *s);
int puts(const char *s);

gets()函數用於讀取整行輸入,直到遇到換行符,然後丟棄換行符,存儲其餘字符,並且在這些字符後面添加一個’\0’使其成爲一個C字符串。

puts()函數與gets()函數配套使用,該函數用於顯示字符串,並在末尾添加一個換行符

通常,gets()函數是不安全的,因爲gets()函數只有一個參數s用於表示字符串存儲的地址,而無法判斷讀取的字符串是否超過s的內存大小。當gets()函數獲取的字符串長度超過s地址允許的數組長度時候,會造成緩衝區溢出的情況。因此,C11標準中,gets()函數廢除。


char *fgets(char *s, int size, FILE *stream);
int fputs(const char *s, FILE *stream);

fgets()函數用於stream中最多讀取一個小於size的字符,並將它們存儲到s指向的緩衝區中,fgets()函數執行成功會返回與第1個參數一樣的地址,如果讀到文件結尾則會返回一個空指針

fgets()函數通過第2個參數size來限制讀入的字符個數來解決緩衝區溢(buffer overflow)出問題。

fgets()gets()的區別:

  1. fgets()函數的第二個參數指明瞭讀入字符的最大數量。如果該函數的值是n,那麼fgets()將讀入n-1個字符,或者讀到遇到的第一個換行符位置。
  2. 如果fgets()讀到一個換行符,會把它存儲在字符串中,但gets()會直接丟棄換行符。
  3. fgets()函數的第3個參數指明瞭要讀入的文件,而gets()用於從鍵盤讀取輸入。

fputs()函數與fgets()函數配對使用。fputs()函數的第二個參數指明他要寫入的文件,與puts()函數不同的是,fputs()函數不會再待輸出的字符串末尾添加一個換行符,而是字符串中有什麼就輸出什麼。


char *gets_s(char *s, int size);

gets_s()函數是C11新增的用於代替gets()的函數(可選)。其用法與gets()函數類似,只是增加了第2個參數限制輸入的字符的數量。

gets_s()函數與fgets()函數的區別:

  1. gets_s()函數只從標準輸入中讀取數據,所以不需要第3個參數;
  2. 如果gets_s()函數讀到換行符,會丟棄它,與gets()函數一致。
  3. 如果gets_s()函數讀到最大字符數都沒有讀到換行符,會執行以下幾步:首先把目標數組中的首字符設置爲空字符,讀取並丟棄隨後的輸入直到換行或EOF,然後返回空指針。接着,調用以來實現的“處理函數”(或者你選擇的其他函數),有可能中止或退出程序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章