我有一个函数可以将文件中的双打扫描到单独的数组中,其中双精度数在它们被扫描的数组中交替。
它在很大程度上起作用,但我还想添加计算扫描多少双打的能力,无论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;
}
答案 0 :(得分:1)
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
$