0

私は入門用の C コース用に非常に小さなプログラムをいくつか書いています。そのうちの 1 つは、1 行に 1 つの数値で double 値を読み取り、EOF の後に基本的な統計情報を出力する必要があります。問題を引き起こしているコードのセグメントは次のとおりです。

double sample[1000000];
int result;
double number; 
int i = 0;
int count = 0;
double sum = 0;
double harmosum = 0;
result = scanf(" %lf \n", &number); 
double min = number;
double max = number; 

while(result != EOF){

    sample[i] = number;
    if(number < min){
        min = number;
    }
    if(number > max){
        max = number;
    }
    sum += number;
    if(number != 0){
        harmosum += (1 / number);
        count++;
    }
    i++;
    result = scanf(" %lf \n", &number);  
}

この後、数値に基づいていくつかの統計を計算して出力します。

私の問題は、各行をスキャンするループから抜け出せないことです。どうしてこれなの?Windows で EOF キーを押すと (CTRL-Z?)、コンソールに次のように表示されます。

^Z 中断

それだけです。プログラム内の他の何も実行されません。テキストファイルから入力を取得しようとしましたが、ファイルの終わりも検出されません。このループを修正するにはどうすればよいですか? 関数のバリエーションがない基本的な scanf() しか使用できないことに注意してください。ありがとう!

4

2 に答える 2

1

さて、プロジェクトのこの最初の部分をあきらめて他の部分をデバッグした後、上記のコードの唯一の問題は、範囲外の配列のインデックスを参照しようとしていることだと判断しました。また、EOF キーは ctrl-d であると判断しましたが、教授から Windows の場合は ctrl-z であると読んで言われました。とにかく、これは簡単に修正できるはずです。情報を提供してくれた皆さん、どうもありがとう!

于 2013-06-21T02:06:00.890 に答える
1

以下のコードは、I/O の問題を簡略化したものです。

" %lf "3 つの scanf() フォーマット ディレクティブを提供します: 1) 空白 2) ダブル指定子、3) 空白。

%lfオプションの先行空白が許可されているため、最初の空白ディレクティブは必要ありません。2 番目の空白ディレクティブは、追加の入力を待機してEnter キーを消費するため、問題を引き起こします。

"%lf" supplies 1 scanf() format directives: double specifier

これは、前の \n を含むオプションの先頭の空白を消費し、ダブルをスキャンしてデコードします。\n番号に続く( Enter キー) は、次の入力 (次の scanf()) のために入力バッファーに残されます。


コントロール Z が失敗する理由について説明します。コンソールが ^Z を消費し、「サスペンド ジョブ」を実行しているようです。私のコンソールは、プログラムに ^Z を与える代わりに、stdin 入力を閉じます。本質的には、標準入力に EOF を入れます。

したがって、次のいずれかを行う必要があります:
1)標準入力を閉じるためのコンソールのメカニズムを見つけます-他の人は^ Dを提案しました。
2) 別の方法を使用してループを終了します。result != 1数値以外の入力が入力されたときにすぐに発生することをお勧めします。

#include <stdio.h>
int main(int argc, char *argv[]) {
  int result;
  double x = 0.0;
  do {
    // result = scanf(" %lf ", &x);  /* Your original format */
    result = scanf("%lf", &x);
    printf("%d %lf\n", result, x);
    fflush(stdout);  // Your system may not need this flush
  } while (result != EOF);
}
于 2013-06-21T01:53:44.797 に答える