我有一个函数,它可以将文件中的双倍扫描到单独的数组中,在这个数组中,双子可以选择在哪个数组中进行扫描。
它在很大程度上是可行的,但我也想增加一种能力,即不管ARR_SIZE扫描了多少个双倍,所以我可以显示一个警告,说明有多少个双倍没有用于在1500以上增加sigSize计数器。
我的尝试只是从条件中删除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;
}发布于 2013-10-17 05:05:45
理解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
$ https://stackoverflow.com/questions/19417432
复制相似问题