プロが教えるわが家の防犯対策術!

例えば下のようなプログラムを実行すると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 ) ;
}
}
--------------------------------

A 回答 (3件)

つぎのように、改良してください。


scanf ( " %d ", &i ) ;
の前に
rewind(stdin);
または
fflush(stdin);
を追加して下さい。
ストリームのバッファをフラッシュします。
    • good
    • 2
この回答へのお礼

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

お礼日時:2002/10/09 20:46

> 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');
を実行すると良いようです。

# プログラムを掲載する際は、見た目を気にして余計な空白などを入れない方がいいですよ。
# コピーしてもコンパイルできませんでした。
    • good
    • 1
この回答へのお礼

私の環境では質問の通りの結果が出るようです。
コンパイラやOSの仕様となると私のレベルを軽く越えてしまうので難しいですが
丁寧な回答ありがとうございました。

># プログラムを掲載する際は、・・・
まったくおっしゃる通りで、お手数おかけしました。すみません。

お礼日時:2002/10/09 20:55

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2002/10/09 20:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!