0

double をファイルから個別の配列にスキャンする関数があります。この場合、double は、スキャンされる配列で交互になります。

ほとんどの場合は機能しますが、ARR_SIZE に関係なくスキャンされた double の数をカウントする機能も追加したいので、1500 を超える sigSize カウンターをインクリメントするために使用されなかった double の数に関する警告を表示できます。

私の試みは、条件から ARR_SIZE のものを削除するか、移動することでした。そのため、3 番目のカウンターを追加するだけで済みますが、結果が間違っています。また、ファイルからではなくキーボードで入力すると、自動的に 1500 に増加します。

全体として、EOFの使用方法について明確な理解がないように思われます。助けていただければ幸いです。

ARR_SIZE は 1500 です

Size read_array(double array1[], double array2[])
{
    Size size = {0, 0};

    int i = 0;

    int status1 = 0;
    int status2 = 0;

    while(size.sigSize1 < ARR_SIZE && size.sigSize2 < ARR_SIZE && 
         (status1 != EOF || status2 != EOF))
    {

        status1 = scanf("%lf", &array1[i]);

        if(status1 != EOF)
        {
            size.sigSize1++;
        }        

        status2 = scanf("%lf", &array2[i]);

        if(status2 != EOF)
        {
            size.sigSize2++;
        }

        i++;

    }

    return size;
}
4

1 に答える 1

1

EOF について

このscanf()関数は、正常に割り当てられた値の数を報告するか、何かを読み取る前に EOF に遭遇した場合は EOF を報告します。

ここでテストする正しい方法if (status1 != 1)は、入力内の迷子の英数字やその他の数字以外の文字から保護することです。現時点では、問題を特定するどころか、コードが無期限にループし、最終的にはクラッシュします。

コードの修正

これは SSCCE ( Short, Self-Contained, Correct Example ) ではないため、型の内容を推測する必要がありSizeます。ただし、次のようなものを処理できます。

#include <stdio.h>
#include <limits.h>

typedef struct Size
{
    int sigSize1;
    int sigSize2;
    int sigSize3;
    int sigSize4;
} Size;

enum { ARR_SIZE = 15 };  // 1500 per question

static Size read_array(double array1[], double array2[])
{
    Size size = {0, 0, 0, 0};

    for (int i = 0; i < INT_MAX; i++)
    {
        double d;

        int status1 = scanf("%lf", &d);

        if (status1 != 1)
            break;
        if (i < ARR_SIZE)
        {
            array1[i] = d;
            size.sigSize1++;
        }
        else
            size.sigSize3++;

        int status2 = scanf("%lf", &d);

        if (status2 != 1)
            break;
        if (i < ARR_SIZE)
        {
            array2[i] = d;
            size.sigSize2++;
        }
        else
            size.sigSize4++;
    }

    return size;
}

int main(void)
{
    double a1[ARR_SIZE];
    double a2[ARR_SIZE];
    Size size = read_array(a1, a2);
    printf("In a1: %d; in a2: %d; missed from a1: %d; missed from a2: %d\n",
           size.sigSize1, size.sigSize2, size.sigSize3, size.sigSize4);
    return 0;
}

与えられたデータ ファイル ( data3):

12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
12.13  19.24
35.43

プログラムからの出力 ( xs) は次のとおりです。

$ ./xs < data3 | so
In a1: 9; in a2: 8; missed from a1: 0; missed from a2: 0
$ cat data3 data3 data3 data3 data3 | ./xs | so
In a1: 15; in a2: 15; missed from a1: 28; missed from a2: 27
$ 
于 2013-10-17T05:05:45.240 に答える