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'結尾。