0

我有一个函数可以将文件中的双精度数扫描到单独的数组中,其中双精度数在它们被扫描的数组中交替。

它在大多数情况下都有效,但我还想添加计算扫描了多少双精度的功能,而不管 ARR_SIZE 是多少,所以我可以显示一个警告,说明没有使用多少双精度来将 sigSize 计数器增加到 1500 以上。

我的尝试只是从条件中删除 ARR_SIZE 东西,或者移动它,所以我可以添加第三个计数器,但这会使我的结果错误。此外,如果我用键盘而不是从文件中输入输入,它会自动增加到 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(简短、自包含、正确示例),我们必须猜测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 回答