第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用scanf()讀取行不好嗎?

使用scanf()讀取行不好嗎?

C
月關(guān)寶盒 2019-11-02 14:10:25
scanf(" %[^\n]",line);我的一個(gè)朋友建議,使用fgets()讀取行作為輸入比使用scanf()上面的語句中的輸入要好得多。他有道理嗎?
查看完整描述

3 回答

?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊

char * fgets ( char * str, int num, FILE * stream );可以安全使用,因?yàn)樗苊饬司彌_區(qū)溢出問題,它僅掃描num-1char數(shù)。


從流中讀取字符,并將它們作為C字符串存儲(chǔ)到str中,直到已讀取(num-1)個(gè)字符或到達(dá)換行符或到達(dá)文件末尾為止,以先發(fā)生的為準(zhǔn)。


這里的第二個(gè)參數(shù)num是要復(fù)制到str中的最大字符數(shù)(包括終止的空字符)。


例如,假設(shè)您的代碼中的字符串?dāng)?shù)組容量僅為5chars,如下所示。


 char str[5];

 fgets (str, 5, fp);  //5 =you have provision to avoid buffer overrun 

使用上面的代碼,如果從輸入fp長度超過4字符,fgets()會(huì)讀只是第一個(gè)4字符,然后追加\0(和丟棄其它多余輸入字符,只是存儲(chǔ)在五個(gè)字符str[])。


而scanf(" %[^\n]",str);會(huì)讀,直到\n沒有發(fā)現(xiàn),如果輸入的字符串長度超過4字符scanf()會(huì)導(dǎo)致緩沖區(qū)溢出(因?yàn)閟canf會(huì)嘗試訪問內(nèi)存到最大的索引4中str[])。


查看完整回答
反對 回復(fù) 2019-11-02
?
明月笑刀無情

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊

C FAQ中有關(guān)于scanf的問題的一些詳細(xì)說明:


更一般而言,scanf是為相對結(jié)構(gòu)化的格式化輸入而設(shè)計(jì)的(其名稱實(shí)際上是從“掃描格式化”派生的)。如果您注意的話,它會(huì)告訴您它是成功還是失敗,但是它只能告訴您它在哪里失敗,而根本不告訴您如何或?yàn)槭裁础D鷰缀鯖]有機(jī)會(huì)進(jìn)行任何錯(cuò)誤恢復(fù)。


查看完整回答
反對 回復(fù) 2019-11-02
?
皈依舞

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊

fgets會(huì)比這更好scanf。scanf如OP中所述,可能存在以下問題


1)@Grijesh建議的緩沖區(qū)溢出


2)scanf由于換行符留在輸入流中,因此此操作之后的下一個(gè)可能不起作用。(如果您錯(cuò)過了空格)


查看完整回答
反對 回復(fù) 2019-11-02
  • 3 回答
  • 0 關(guān)注
  • 608 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)