天天看點

字元串輸入gets和fgets函數的差別1. gets與fgets

1. gets與fgets

  gets函數原型:char*gets(char*buffer);//讀取字元到數組:gets(str);str為數組名。

  gets函數功能:從鍵盤上輸入字元,直至接受到換行符或EOF時停止,并将讀取的結果存放在buffer指針所指向的字元數組中。

         讀取的換行符被轉換為null值,做為字元數組的最後一個字元,來結束字元串。

  注意:gets函數由于沒有指定輸入字元大小,是以會無限讀取,一旦輸入的字元大于數組長度,就會發生記憶體越界,

     進而造成程式崩潰或其他資料的錯誤。

  fgets函數原型:char *fgets(char *s, int n, FILE *stream);//我們平時可以這麼使用:fgets(str, sizeof(str), stdin);

          其中str為數組首位址,sizeof(str)為數組大小,stdin表示我們從鍵盤輸入資料。

  fgets函數功能:從檔案指針stream中讀取字元,存到以s為起始位址的空間裡,知道讀完N-1個字元,或者讀完一行。

  注意:調用fgets函數時,最多隻能讀入n-1個字元。讀入結束後,系統将自動在最後加'\0',并以str作為函數值傳回。

2. 細節介紹

在來細說一下fgets的用法,我們以char str[N];fgets(str, N, stdin);為例:

    fgets隻能讀取N-1個字元,包括最後的'\n',讀完結束後系統将自動在最後加'\0'(gets讀完結束後系統自動會将'\n'置換成'\0')。

    說到這裡就有倆種情況了:

一:當你從鍵盤上輸入<=N-1個字元(包括'\n')時,那麼字元串str會以‘\n\0’結尾。這就造成了strlen(str)比你想象的大 1 ,

      當然你可以通過下面代碼将'\n'去掉。

二:當你從鍵盤上輸入>N-1個字元(包括'\n')時,那麼字元串str會以'\0'結尾。