3 回答

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[])。

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ù)。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
fgets會(huì)比這更好scanf。scanf如OP中所述,可能存在以下問題
1)@Grijesh建議的緩沖區(qū)溢出
2)scanf由于換行符留在輸入流中,因此此操作之后的下一個(gè)可能不起作用。(如果您錯(cuò)過了空格)
- 3 回答
- 0 關(guān)注
- 608 瀏覽
添加回答
舉報(bào)