欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言中輸入函數(shù)(scanf()、fgets()和gets())的區(qū)別詳解

 更新時(shí)間:2017年11月30日 09:26:42   作者:Leon_Geo  
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中三種輸入函數(shù)(scanf()、fgets()和gets())區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

大家都知道在C語(yǔ)言中,有三種主要的輸入函數(shù):scanf(),fgets()以及gets()。他們的使用方法及注意事項(xiàng)如下:

1.scanf()

它是一種格式化的輸入方式,可一次性按照規(guī)定的格式輸入多個(gè)數(shù)據(jù)域。

scanf函數(shù)是一個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù),它的函數(shù)原型在頭文件“stdio.h”中。與printf函數(shù)相同,C語(yǔ)言也允許在使用scanf函數(shù)之前不必包含stdio.h文件。

scanf函數(shù)的一般形式為:

scanf(“格式控制字符串”, 地址表列);

其中,格式控制字符串的作用與printf函數(shù)相同,但不能顯示非格式字符串,也就是不能顯示提示字符串。地址表列中給出各變量的地址。地址是由地址運(yùn)算符“&”后跟變量名組成的。

例如:&a、&b分別表示變量a和變量b的地址。

下面以輸入規(guī)定的長(zhǎng)度的字符串為例,來(lái)說(shuō)說(shuō)它的使用方法和容易產(chǎn)生的bug。

要求:定義一個(gè)長(zhǎng)度為10的個(gè)字符數(shù)組,由用戶通過(guò)鍵盤(pán)為其賦值。

Code:

  char name[10];

  scanf("%9s",name);

說(shuō)明:之所以使用%9s是因?yàn)槲覀冞€需要預(yù)留一個(gè)位置給字符串結(jié)束標(biāo)志'\0',所以用戶輸入的名字最長(zhǎng)只能為9,且其中不能包含空格類字符(空格,回車,首行縮進(jìn)符),因?yàn)閟canf函數(shù)認(rèn)為它們是字符串的結(jié)尾。

危險(xiǎn):當(dāng)用戶輸入的名字超過(guò)9個(gè)衣服時(shí),系統(tǒng)將會(huì)產(chǎn)生段錯(cuò)誤(segment fault),如果運(yùn)氣好程序可能不會(huì)提示錯(cuò)誤,如果不好,可能內(nèi)存中重要的數(shù)據(jù)被覆蓋!

2.fgets(char *name, int length, fd)

頭文件:include<stdio.h>

該函數(shù)從文件描述符fd指定的文件獲得length個(gè)字符存入從name開(kāi)始的length個(gè)內(nèi)存單元中。由于其形參中規(guī)定了最大接受字符數(shù),故不會(huì)發(fā)生像scanf函數(shù)那樣的緩存溢出的問(wèn)題。

要求:定義一個(gè)長(zhǎng)度為10的個(gè)字符數(shù)組,由用戶通過(guò)鍵盤(pán)為其賦值。

Code:

  char name[10];

  fget(name,sizeof(name),stdin);

說(shuō)明:因?yàn)榇颂巒ame是一個(gè)數(shù)組名,雖然它本質(zhì)上是一個(gè)指針,但聰明的sizeof函數(shù)會(huì)把他區(qū)別于一般的指針變量,從而根據(jù)之前的定義求出數(shù)組的長(zhǎng)度。但若是一般的指針變量,sizeof函數(shù)求出的值就是4或是8了。

3.gets()

它通過(guò)鍵盤(pán)獲得字符串輸入,并且沒(méi)有任何字符串長(zhǎng)度上的限制和檢測(cè),建議應(yīng)該避免在我們的代碼中使用該函數(shù)!

要求:定義一個(gè)長(zhǎng)度為10的個(gè)字符數(shù)組,由用戶通過(guò)鍵盤(pán)為其賦值。

Code:

  char name[10];

  gets(name);

注意:本函數(shù)可以無(wú)限讀取,不會(huì)判斷上限,所以程序員應(yīng)該確保buffer的空間足夠大,以便在執(zhí)行讀操作時(shí)不發(fā)生溢出。為了避免這種情況,我們可以用fgets()來(lái)替換gets()。

危險(xiǎn):任何時(shí)候均要避免使用該函數(shù),雖然它存在已經(jīng)有很長(zhǎng)一段時(shí)間了。

區(qū)別:

1.是否對(duì)用戶輸入的字符個(gè)數(shù)有所限制?

兩者均有所限制,但scanf函數(shù)需要你在格式化說(shuō)明符中顯示注明,若不注明則無(wú)限制,可能會(huì)導(dǎo)致溢出事故;fgets函數(shù)則將其作為一個(gè)形參予以強(qiáng)制規(guī)定。

2.用戶是否可以同時(shí)輸入多個(gè)域的數(shù)據(jù)?

scanf函數(shù)可以通過(guò)添加多個(gè)格式化輸入說(shuō)明符來(lái)實(shí)現(xiàn)多域輸入,而fgets函數(shù)每次僅能對(duì)一個(gè)域賦值。

3.用戶輸入的字符串中可以包含空格類字符嗎?

 scanf函數(shù)會(huì)把空格符當(dāng)做字符串的結(jié)束符,故不可以在一個(gè)字符串中含有空格。而否則可以。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • C語(yǔ)言詳細(xì)分析講解struct與union使用方法

    C語(yǔ)言詳細(xì)分析講解struct與union使用方法

    最近開(kāi)始自學(xué)C語(yǔ)言,從最基礎(chǔ)部分的開(kāi)始學(xué)起。今天看書(shū)的時(shí)候注意到了struct和union似乎很像,除了名字不同,看起來(lái)幾乎沒(méi)有區(qū)別。<BR>既然C中定義了struct和union兩個(gè)關(guān)鍵字,那么它們肯定是有區(qū)別的,在查了一些資料之后我來(lái)總結(jié)一下他們的使用
    2022-04-04
  • C語(yǔ)言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼

    C語(yǔ)言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼

    這篇文章主要為大家?guī)?lái)了C語(yǔ)言實(shí)現(xiàn)靜態(tài)動(dòng)態(tài)兩版本的通訊錄實(shí)戰(zhàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • C++結(jié)構(gòu)體字節(jié)對(duì)齊示例

    C++結(jié)構(gòu)體字節(jié)對(duì)齊示例

    這篇文章主要為大家介紹了C++結(jié)構(gòu)體字節(jié)對(duì)齊示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • C++消息隊(duì)列(定義,結(jié)構(gòu),如何創(chuàng)建,發(fā)送與接收)

    C++消息隊(duì)列(定義,結(jié)構(gòu),如何創(chuàng)建,發(fā)送與接收)

    這篇文章主要介紹了C++消息隊(duì)列(定義,結(jié)構(gòu),如何創(chuàng)建,發(fā)送與接收),消息隊(duì)列是一種先進(jìn)先出的隊(duì)列型數(shù)據(jù)結(jié)構(gòu),實(shí)際上是系統(tǒng)內(nèi)核中的一個(gè)內(nèi)部鏈表
    2022-08-08
  • VScode運(yùn)行C++中文終端亂碼的解決方案

    VScode運(yùn)行C++中文終端亂碼的解決方案

    這篇文章主要介紹了VScode運(yùn)行C++中文終端亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C語(yǔ)言深入探究動(dòng)態(tài)規(guī)劃之線性DP

    C語(yǔ)言深入探究動(dòng)態(tài)規(guī)劃之線性DP

    線性動(dòng)態(tài)規(guī)劃,是較常見(jiàn)的一類動(dòng)態(tài)規(guī)劃問(wèn)題,其是在線性結(jié)構(gòu)上進(jìn)行狀態(tài)轉(zhuǎn)移,這類問(wèn)題不像背包問(wèn)題、區(qū)間DP等有固定的模板,線性動(dòng)態(tài)規(guī)劃的目標(biāo)函數(shù)為特定變量的線性函數(shù),約束是這些變量的線性不等式或等式,目的是求目標(biāo)函數(shù)的最大值或最小值
    2022-04-04
  • c++與python實(shí)現(xiàn)二分查找的原理及實(shí)現(xiàn)

    c++與python實(shí)現(xiàn)二分查找的原理及實(shí)現(xiàn)

    本文介紹了c++與python實(shí)現(xiàn)二分查找的原理及實(shí)現(xiàn),二分查找指首先將數(shù)組中間值和目標(biāo)值進(jìn)行比較,如果相等則返回;如果不相等,則選擇中間值左邊的一半或者右邊的一半進(jìn)行比較;不斷重復(fù)直到檢索完畢,下文相關(guān)資料需要的朋友可以參考一下
    2022-03-03
  • C++深入講解初始化列表的用法

    C++深入講解初始化列表的用法

    這篇文章主要介紹了C++成員初始化列表,除了可以使用構(gòu)造函數(shù)對(duì)類成員進(jìn)行初始化之外,C++還提供了另外一種初始化的方法,叫做成員初始化列表。下面來(lái)看看文章的詳細(xì)吧,需要的朋友可以參考一下
    2022-04-04
  • Windows程序內(nèi)部運(yùn)行機(jī)制實(shí)例詳解

    Windows程序內(nèi)部運(yùn)行機(jī)制實(shí)例詳解

    這篇文章主要介紹了Windows程序內(nèi)部運(yùn)行機(jī)制實(shí)例詳解,對(duì)于學(xué)習(xí)Windows程序設(shè)計(jì)來(lái)說(shuō)是非常重要的一課,需要的朋友可以參考下
    2014-08-08
  • static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法詳解

    static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法詳解

    以下是對(duì)static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09

最新評(píng)論