1

たとえば、ユーザーが入力した不特定数の数値を平均化するコードを書きたい場合、ユーザーが数値の数を判断できるようにするにはどうすればよいでしょうか? すなわち。ユーザーが 3 つの数値だけを平均したい場合は、一度に 1 つずつ入力してから、これがそれであることを示す何かを入力します。

のようなものを書きました

while(i!=EOF){
    printf("type in a number: \n");
    scanf("%f",&i);
    array[x]=i;
    x++;
}

「そして、配列内の数値を平均化するコード」。

ユーザーが数字の入力を終了したことを通知したい場合は、EOF を入力すると while ループが停止するというアイデアがありましたが、これは機能しません。端末で EOF を入力すると、「数字を入力してください:」と無期限に書き込まれます。

4

5 に答える 5

3

scanfは 2 つの異なる方法で情報を返します: 変数内iで、およびその戻り値として。i数値scanfを返すことができる場合、変数の内容は読み取る数値です。からの戻り値はscanf、数値を読み取ることができたかどうかを示します。

テストは基本的に型エラーです。エラー インジケーターの値を、浮動小数点数を保持するように設計された変数i != EOFと比較しています。EOFこれは誤って有効な C コードであるため、コンパイラは文句を言いません。EOF整数値としてエンコードされ、その値は比較を実行するために浮動小数点値に変換されます。-1実際、プロンプトで入力すると、ループが終了することに気付くでしょう。-1定数の値ですEOF(ほとんどの実装で)。

の戻り値をscanf格納し、それを別の変数に格納する必要があります。戻り値がEOFの場合、ループを終了します。戻り値が 1 の場合、浮動小数点値が正常に読み取られています。

戻り値が 0 の場合、ユーザーは解析できないものを入力しました。このケースを適切に処理する必要があります。何もしないと、ユーザーの入力は破棄されず、プログラムは永久にループします。意味のある 2 つの選択肢は、1 文字を破棄するか、行全体を破棄することです (後者を行います)。

double i;
double array[42];
int x = 0;
int r = 0;
while (r != EOF) {
    printf("type in a number: \n");
    r = scanf("%f", &i);
    if (r == 1) {
        /* Read a number successfully */
        array[x] = i;
        x++;
    } else if (r == 0) {
       printf("Invalid number, try again.\n");
       scanf("%*[^\n]"); /* Discard all characters until the next newline */
    }
}

xまた、配列の境界をオーバーフローしていないことも確認する必要があります。これは練習問題として残しておきます。

于 2013-03-23T20:10:00.350 に答える
1

数字じゃないものを打ち込んでやりたい

次に、入力を文字列として取得し、数値に変換できない場合は終了します。

char buf[0x80];
do {
    fgets(buf, sizeof(buf), stdin);
    if (isdigit(buf[0])) {
        array[x++] = strtod(buf);
    }
} while(isdigit(buf[0]);
于 2013-03-23T20:02:49.387 に答える
1

入力がない場合、scanf() は i を EOF に設定せず、EOF を返すことができます。したがって、scanf() の戻りコードを分析する必要があります。ちなみに、結果として 0 を受け取ることができます。これは、実際には EOF がないことを意味しますが、数値を読み取ることはできません。

ここにあなたのための例があります:

#include <stdio.h>
#define MAX_SIZE 5

int main()
{
    int array[MAX_SIZE];
    int x = 0;
    int r = 0;
    while (x < MAX_SIZE)
    {
        int i = 0;
        printf("type in a number: \n");
        r = scanf("%d",&i);
        if (r == 0)
        {
            printf("ERROR!\n");
            break;
        }
        if (r == EOF)
        {
            printf("EOF!\n");
            break;
        }
        array[x]=i;
        x++;
    }
}
于 2013-03-23T20:09:53.873 に答える
0

関数の戻り値をテストできscanfます。一致に失敗した場合、または EOF 文字に遭遇した場合は、EOF を返します。

printf("type in a number:" \n);    
while(scanf("%f",&i)!=EOF){
    array[x]=i;
    x++;
    printf("type in a number:" \n);  
}
于 2013-03-23T20:07:10.643 に答える
0

「EOF」と書くことはできません..数値を読み取っているため... EOFは-1に等しい..彼がそれを入力した場合、ループは停止します

于 2013-03-23T19:58:48.777 に答える