程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C說話gets()函數與它的替換者fgets()函數

詳解C說話gets()函數與它的替換者fgets()函數

編輯:關於C++

詳解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()函數的相干常識,願望對年夜家有所贊助,假如年夜家想懂得更多,敬請存眷!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved