詳解C說話gets()函數與它的替換者fgets()函數。本站提示廣大學習愛好者:(詳解C說話gets()函數與它的替換者fgets()函數)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C說話gets()函數與它的替換者fgets()函數正文
在c說話中讀取字符串有多種辦法,好比scanf() 合營%s應用,然則這類辦法只能獲得一個單詞,即碰到空格等空字符就會前往。假如要讀取一行字符串,好比:
I love BIT
這類情形,scanf()就力所不及了。這時候我們最早想到的是用gets()讀取.
gets()函數從尺度輸出(鍵盤)讀入一行數據,所謂讀取一行,就是碰到換行符就前往。gets()函數其實不讀取換行符'\n',它會吧換行符調換成空字符'\0',作為c說話字符串停止的標記。
gets()函數常常和puts()函數配對應用,puts()函數用於顯示字符串,並主動在字符串前面添加一個換行標記'\n'
gets()函數存在一個嚴重的缺點,這個缺點就是:它不會檢討數組能否可以或許裝的下輸出行:
好比:
我們界說了一個數組char src[5],這時候候我們挪用gets(src),來從尺度輸出讀取字符串,我們看到gets()函數的參數為數組名,我們都曉得,數組名就相當於一個指針,也就是數組的首地址。這時候假如我們的輸出年夜於5個字符,好比 I love BIT,gets()函數會從src所指地址開端,順次填入每一個字符,然則src只分派了5個字節的空間,填滿這五個空間後,gets()函數就會拜訪未被分派的內存空間,假如這片空間曾經存稀有據,這時候法式就會產生毛病,而中止。
正式因為gets()函數的這個缺點,在C99尺度中,曾經不再建議應用gets()函數,而在C11中更是直接擯棄了這個函數。
gets()被擯棄,那我們用甚麼來取代它的功效呢?
C11尺度新增了gets_s()函數可以取代gets()函數,然則,該函數是stdio.h輸出輸入函數系類中的可選擴大,是以,即便編譯器支撐C11尺度,也有能夠不支撐gets_s()函數。
其實我們可以用c說話中的fgets()函數來取代gets()
我們先看一下函數原型聲明:
char *fgets(char *buf, int bufsize, FILE *stream);
留意一下第二個參數bufsize,這個參數就限制了讀取的字符的個數,這便可以處理gets()函數的缺點。
我們曉得fgets() 函數重要用於讀取文件,假如要讀取鍵盤,則stream參數應當為stdin,
須要留意的是,假如bufsize設置為n,那末fgets()函數最多讀取n-1個字符,之所以用“最多”這個詞是由於,假如在之前碰到了換行符,fgets函數也會前往。
還有一點就是,fgets()函數會讀取換行符(這一點和gets函數分歧),當讀取停止後,fgets函數會為buf在末尾添加一個空字符作為字符串的停止。
可以看一個簡略的小例子:
#include <stdio.h> #include <stdlib.h> #define LEN 6 int main(int argc,char* argv[]) { char src[LEN]; printf("please enter:\n"); fgets(src,LEN,stdin); printf("your enter is:\n"); fputs(src,stdout); }
在這個法式中,我把數組的長度設置為6,先看一組輸出和輸入:
輸出為zhan和回車('\n'),一共五個字符,fgets會讀取這五個字符,然後在末尾添加字符串停止標記'\0';
我們曉得fputs()函數其實不會主動添加換行,然則輸入成果卻換行輸入了Press any....,這就解釋了fgets()函數是會讀取換行符的。
在看一組輸出輸入:
此次我輸出了zhang和回車換行,fgets函數仍然是讀取5個字符(LEN-1個),這時候fgets()讀入zhang,曾經是五個字符了,所以回車換行其實不會讀入,最初fgets()添加字符串停止標記'\0',所以我們看到輸入時,Press any...並沒有換行輸入,而是和zhang在統一行。
最初看一組輸出和輸入:
信任不消說明年夜家也都明確了。
總結一下就是:
gets函數沒無限制讀入的個數,這極可能會招致法式向未知的內存空間寫入數據,而招致法式失足。
fgets函數中第二個參數限制了讀取的個數,這也處理了gets函數存在的成績,但要留意fgets函數只會讀取n-1個字符(假如碰到換行符會更少),並在最初添加字符串停止標記,並且,fgets也會將換行符讀入。
以上所述是小編給年夜家引見的詳解C說話gets()函數與它的替換者fgets()函數的相干常識,願望對年夜家有所贊助,假如年夜家想懂得更多,敬請存眷!