• ベストアンサー

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 ) ; } } --------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • brogie
  • ベストアンサー率33% (131/392)
回答No.2

つぎのように、改良してください。 scanf ( " %d ", &i ) ; の前に rewind(stdin); または fflush(stdin); を追加して下さい。 ストリームのバッファをフラッシュします。

comeandswinging
質問者

お礼

求めていた通りの動きをしてくれました。 初期化することでgetcharなんかも使いやすくなりそうですね。 ありがとうございました。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

> 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'); を実行すると良いようです。 # プログラムを掲載する際は、見た目を気にして余計な空白などを入れない方がいいですよ。 # コピーしてもコンパイルできませんでした。

comeandswinging
質問者

お礼

私の環境では質問の通りの結果が出るようです。 コンパイラやOSの仕様となると私のレベルを軽く越えてしまうので難しいですが 丁寧な回答ありがとうございました。 ># プログラムを掲載する際は、・・・ まったくおっしゃる通りで、お手数おかけしました。すみません。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

関数aaの中で、既にEOFになっているのだから、そこから戻って以降の、mainでscanfしてもムダでは?

comeandswinging
質問者

お礼

EOFを入力したあとはscanfは使えないのですね。 ありがとうございました。