首页
学习
活动
专区
圈层
工具
发布

理解EOF
EN

Stack Overflow用户
提问于 2013-10-17 02:49:56
回答 1查看 349关注 0票数 0

我有一个函数,它可以将文件中的双倍扫描到单独的数组中,在这个数组中,双子可以选择在哪个数组中进行扫描。

它在很大程度上是可行的,但我也想增加一种能力,即不管ARR_SIZE扫描了多少个双倍,所以我可以显示一个警告,说明有多少个双倍没有用于在1500以上增加sigSize计数器。

我的尝试只是从条件中删除ARR_SIZE内容,或者移动它,这样我就可以添加第三个计数器,但这使我的结果错了。另外,如果我用键盘输入输入,而不是从文件中输入,它会自动增加到1500。

总的来说,我似乎对如何使用EOF缺乏明确的理解,任何帮助都将不胜感激!

ARR_SIZE是1500

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-17 05:05:45

理解EOF

scanf()函数报告它成功分配了多少个值,或者如果它在读取任何其他东西之前遇到EOF,那么报告EOF。

这里正确的测试方法是if (status1 != 1),它可以防止输入中的杂乱字母数字或其他非数字字符。目前,您的代码将无限期地循环,最终崩溃,而不是发现问题。

修正代码

因为这不是SSCCE (简短的,完整的,正确的例子),所以我们必须猜测Size类型的内容。然而,我们可以处理更多这样的事情:

代码语言:javascript
复制
#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):

代码语言:javascript
复制
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)的输出是:

代码语言:javascript
复制
$ ./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
$ 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19417432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档