scanfは予期しない入力があると無限ループに陥る(C学習中)
今日覚えたこと
scanf で int 型の変数に値を受け取り、ある値と等しければ break する。それまで while(1) で回す。
というコードを書いていた。こういうの。
int hoge; int moga = 7; while(1) { scanf("%d", &hoge) if (hoge < moga) { // hogeが小さいとかどーとか } else if (moga < hoge) { // hogeが大きいとかどーとか } else { break; } }
この処理に数字を渡した場合、意図通り動く。しかし、英字を渡すと、プログラムが終了しなくなる。
これは、予期しない入力に対する scanf の振る舞いのため。次の2つの対処をする。
- scanfの戻り値を利用して、無限ループを回避する
- 何らかの方法で、バッファをクリアする
宿題
- 回避方法が何種類かあるらしいので、試す
- 参考:標準入出力関数(1)
- 参考:情報基礎演習II − 第6回
わからないこと
- sscanfを代わり使った回避方法
- scanf - Wikipedia の「異常な入力が行われた時の処理」のところ