2012-05-05 10 views
1

は、私はEnterキーを押すまで、私はEOFとscanf関数の戻り値を比較しようとした数字を受信する必要があるが、それは(無限ループ)以上の数字を入力するように私を求め続けている:
EOFを使ってscanfループを終了するには?

int fail=0, late=0, avg=0, i=0, last=0, current, permission, difference; 
while(scanf(" %d", &current) != EOF) 
{ 
    permission = (current < last); 
    difference = ((last - current) >= 30); 
    fail += difference*permission; 
    late += permission; 
    avg += (last - current)*(permission); 
    last = last*(permission) + current*(!permission); 
} 

任意の提案。
thanx

答えて

1

まあ、scanfの仕様によれば、空白文字を読み込んだり無視したりします。また、この仕様では、入力エラーが発生した場合にのみEOFが返され、データが正常に読み取られることが示されています。あなたは自分でそれを読むことができますhere

他の回答に記載されている他の読み取り機能を使用することをおすすめします。あなたは、おそらくあなたは、一番下に、内部に以下のコードを追加することができ、そのscanf関数のループと一緒に暮らすと死ななければならない場合でも、:

if (getchar() == '\n') break; 

あなたの入力は数字だけであり、それだけの方法だ場合、それは動作するはずですそれを回避してください。 Linuxを使用している場合

+0

結局のところ、scanfが正常に読み取られた項目の数を返すので、無限ループを中断していることに注意してください(どのwoul dはゼロではない) – PALEN

0

問題点の1つは、scanfのマニュアルではほとんどのフォーマット変換で空白をスキップするということです。 (これには改行と復帰改行が含まれます)

1つのオプションは、一度に1文字を読み取り、次にいくつかの数字を作ることです。このようにして、偽の入力を捕まえることができます。また、インライン空白(スペースとタブ)と行終了空白(CRとNL)を区別することもできます。

0

あなたはCTRL+D

EOF = CTRLを入力する場合は、あなたのwhileループを停止することができます + D

EOF = CTRL + Z((Linux用)

関連する問題