- ベストアンサー
scanf()関数は不安定
今晩は、Cの初心者です、宜しくお願いします。 参考書を読んでると「数値をキーボードからとる場合、scanf()関数を使う場合は不安定な動きをする場合があるので、gets()関数で値を文字配列としてとりその後数値に変換するのが良い」と書いていました。 この意味が良く理解できないのですが、scanf()関数よりgets()関数が安定しているということでしょうか。 それとも、数値列としてキーボードからとるよりも、文字列としてとってやった方がよいという意味でしょうか。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
scanfの問題点と回避方法は、 http://ja.wikipedia.org/wiki/Scanf#scanf.E3.81.AE.E5.95.8F.E9.A1.8C.E7.82.B9.E3.81.A8.E5.9B.9E.E9.81.BF.E6.96.B9.E6.B3.95 が参考になると思います。 gets()を使用するのは、もってのほかです。 gets()は、scanf("%s", a);と同じバッファオーバーラン問題を 抱えており、実用的なプログラミングでは絶対に使用してはならない 関数とされています。 参考 : http://ja.wikipedia.org/wiki/Gets
その他の回答 (3)
- jacta
- ベストアンサー率26% (845/3158)
実装にもよりますが、scanfもgetsも、通常不安定ということはありません。 ただ、getsの問題は配列の大きさを規定できないことにあります。運用方法に制約を加えられない状況であれば、使うのはよくないでしょう。 scanfは、文字や文字列の入力であればよいのですが、数値の入力はエラーチェックが行えないので使用すべきではありません。 fgetsで読み込んでからsscanfで解析する場合でも同じ問題があります。
- php504
- ベストアンサー率42% (926/2160)
不安定というか入力バッファに残った非数字を読み続けて無限ループのプログラムになる可能性が高いとはいえますね scanfの戻り値を確認してちゃんとプログラムすれば安定したプログラムになりますよ それよりgets( )のほうこそ使うなと教えるのが普通では
- asuncion
- ベストアンサー率33% (2127/6289)
scanf関数は、第1引数で定義した書式文字列と異なる内容を入力したとき、 簡単に暴走することがあります。 練習用のプログラムだったり、使うのが自分だけだったりするのであれば 使ってもかまわないと思います。 業務用プログラムでは、まず使わない(or 使えない)と思ってよいでしょう。 gets関数を使うほうがよい、というのはおそらく何かの間違いでしょう。 fgets関数のことを言っているのであれば、まだわかります。
お礼
みなさん、回答ありがとうございました。 非常に勉強になりました、今後とも宜しくお願いします。 もっと自分でも勉強します。