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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

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

3 回答

?
largeQ

TA貢獻2039條經(jīng)驗 獲得超8個贊

char * fgets ( char * str, int num, FILE * stream );可以安全使用,因為它避免了緩沖區(qū)溢出問題,它僅掃描num-1char數(shù)。


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


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


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


 char str[5];

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

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


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


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

TA貢獻1828條經(jīng)驗 獲得超4個贊

C FAQ中有關于scanf的問題的一些詳細說明:


更一般而言,scanf是為相對結構化的格式化輸入而設計的(其名稱實際上是從“掃描格式化”派生的)。如果您注意的話,它會告訴您它是成功還是失敗,但是它只能告訴您它在哪里失敗,而根本不告訴您如何或為什么。您幾乎沒有機會進行任何錯誤恢復。


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

TA貢獻1851條經(jīng)驗 獲得超3個贊

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


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


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


查看完整回答
反對 回復 2019-11-02
  • 3 回答
  • 0 關注
  • 612 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號