「scanfは使うな。getsは"絶対に"使うな」というようなことを書いているページがよく見られます。 バッファオーバーフローの危険性は同程度だと思っているのですが、そうではなくてgetsの方が危険性が高かったりするのでしょうか
どちらもバッファオーバーフローの防止策が無いので、基本的には同じです。プログラマがバッファオーバーフローの防止策を作り込む際に、読み込むデータの書式を利用出来るscanfの方が、getsよりは使いやすいと言えます。
(σ・∀・)σゲッツ!!
http://ja.wikipedia.org/wiki/Gets
gets は、…廃止された。
gets のバッファオーバーフローの問題は、単純に gets に渡したバッファサイズを超えて書き込まれる可能性がある、というものですが、scanf でのバッファオーバーフローは、scanf 自体の問題と言うよりも、不適切な書式指定子の問題になります。scanf バッファオーバーラン - Wikipedia%s で受ける時にフィールド幅を指定しないと、バッファーオーバーフローが起こる、という話で、逆に上記ページの例にあるように %19s といった形でフィールド幅を指定すれば問題はありません。ただ、scanf を使うな、という話は、セキュリティ的にバッファーオーバーフローが話題になるよりずっと前に、「入力が指定した書式と一致しなかった時の問題」があって、匿名回答3号さんがコメントで書かれている通り、「fgets と sscanf を使え」と言われます。この問題は、同じ Wikipedia の下記の章に例も書かれているので、一度、試してみると分かると思います。scanf 異常な入力が行われた時の処理 - Wikipedia