- ベストアンサー
scanf が無視されます
例えば下のようなプログラムを実行するとmain関数の scanf が無視 されてしまいますが何故なのでしょうか。コンパイラはLSI C-86試食版です。 ----------------------------- #include <stdio.h> int main ( ) ; void aa ( ) ; int main ( ) { int i ; aa ( ) ; printf ( " input i. \n " ) ; scanf ( " %d ", &i ) ; printf ( " i = %d\n ", i ) ; } void aa ( ) { int x, y ; while ( scanf ( " %d ", &x ) ! = EOF ) { y = x ; printf ( " y= %d\n ", y ) ; } } --------------------------------
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
つぎのように、改良してください。 scanf ( " %d ", &i ) ; の前に rewind(stdin); または fflush(stdin); を追加して下さい。 ストリームのバッファをフラッシュします。
その他の回答 (2)
- leaz024
- ベストアンサー率75% (398/526)
> main関数の scanf が無視されてしまいます がちょっと気になったので「Borland C++ 5.5.1 for Win32」で試したところ、scanf ではなく、1つ目の printf の方が表示されませんでした。 (↑これは私の予想通りでしたが) 具体的には、関数aaのwhileループを止めるため EOF(ctrl+Z)を入力したところ、それでもなお入力待ちの状態となり、そこで数字(20)を入力+Enterしたら i=20 と表示されました。 質問の記載ミス、あるいは動作確認ミスでなければ、コンパイラ依存の現象として片付けざるを得ませんが、もし上記と同じ状態なのであれば、それは「WindowsのDOSプロンプト窓の制御仕様」ではないかと思われます。 過去にも、DOS窓上での確認において EOF 入力直後の表示が実行されない、という質問がいくつかあり、試行の結果、上記の結論にたどり着いただけなのですが。。。 で、解決策ですが、EOF入力直後の画面に問題があるので、while終了後に putchar('\n'); を実行すると良いようです。 # プログラムを掲載する際は、見た目を気にして余計な空白などを入れない方がいいですよ。 # コピーしてもコンパイルできませんでした。
お礼
私の環境では質問の通りの結果が出るようです。 コンパイラやOSの仕様となると私のレベルを軽く越えてしまうので難しいですが 丁寧な回答ありがとうございました。 ># プログラムを掲載する際は、・・・ まったくおっしゃる通りで、お手数おかけしました。すみません。
- osamuy
- ベストアンサー率42% (1231/2878)
関数aaの中で、既にEOFになっているのだから、そこから戻って以降の、mainでscanfしてもムダでは?
お礼
EOFを入力したあとはscanfは使えないのですね。 ありがとうございました。
お礼
求めていた通りの動きをしてくれました。 初期化することでgetcharなんかも使いやすくなりそうですね。 ありがとうございました。