3 回答

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

TA貢獻1828條經(jīng)驗 獲得超4個贊
C FAQ中有關于scanf的問題的一些詳細說明:
更一般而言,scanf是為相對結構化的格式化輸入而設計的(其名稱實際上是從“掃描格式化”派生的)。如果您注意的話,它會告訴您它是成功還是失敗,但是它只能告訴您它在哪里失敗,而根本不告訴您如何或為什么。您幾乎沒有機會進行任何錯誤恢復。

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