2012-12-28 61 views
2

可能重複:
getc Vs getchar Vs Scanf for reading a character from stdin爲什麼scanf比getchar更安全?

我知道的getchar宏觀需要字符作爲從標準輸入
其中,作爲scanf函數從標準輸入採用任何數據類型作爲輸入

作爲的getchar是一個宏這就是爲什麼它有助於使程序運行速度更快,但是這是inspite推薦到位的getchar的使用scanf函數。 爲什麼?

我在網上了解到scanf與getchar相比是安全的,所以,是什麼使得scanf安全

+0

@iota - 其實我期待着有關安全問題的答案.. - 源代碼 – sourcecode

+0

請看這裏:http://stackoverflow.com/questions/2430303/disadvantages-of-scanf –

+0

我認真看不到scanf as一個「安全」功能。這是來自面試還是其他問題?編寫你自己的安全輸入函數並不是很容易,但是如果你這樣做,getchar肯定會在你使用的[或fetgc()中,這是getchar()最終會調用]。 –

回答

0

scanf更快,因爲它可以一次讀取多個字符。

但是,getchar更安全,因爲它一次只能讀取一個字符。如果未檢查輸入,則使用scanf的程序爲relatively easy to exploit

+0

scanf是否比getchar快當然取決於用例和實際的實現。 –

1

我認爲,當你做了,但最終我會滿足於使用scanf()既可以是爲安全或不安全:因爲它在每個呼叫處理超過一個字符

  • scanf()可能是更快。

  • 其行爲已被充分記錄,這意味着有完善的方法可以避免安全問題,例如在格式字符串中包含硬編碼的長度限制,當然也不會使用用戶輸入生成的格式字符串。

  • scanf()是更容易使用 - getchar()可能對自己的「安全」,但你必須編寫大量的代碼圍繞它得到一些實際的功能在它外面。代碼將複製scanf()提供的功能,然後必須對其進行安全影響進行審查。 scanf()實現可能會廣泛地進行同行評議,這是您自己的代碼可能永遠不會做的事情。

  • 使用標準函數(如scanf())的代碼比基於自定義庫的任何代碼都要容易得多,特別是在人員流動量大的編程團隊中。

+0

真的很糟糕的建議。對於任何考慮使用'scanf'的人,請首先閱讀以下內容:http://www.gidnetwork.com/b-59.html – mvp

+0

@mvp:我想最後會回到實際的上下文中。例如。你會相信某人在他們應該以正確的方式編寫他們自己的字符串解析代碼時不能使用'scanf()'嗎?我在使用'getchar()'來重新發明輪子時看到了無法形容的暴行...... – thkala

-1

的getchar()是我所知道的和我看過,雖然它被稱爲是由一些網站的微距功能,但它顯然是稱爲官方 C++ Reference website.

功能

當你需要一個字符並且只有一個字符被鍵盤輸入時,使用getchar(),因爲scanf()用於獲取多個字符。哪一個比另一個更快取決於你的要求和實施。

就安全性和易用性而言,我會投我的票到scanf(),因爲我可以輸入多個字符,並且我不必在使用scanf()後使用flush(),有時在使用getchar()時變爲強制。