使用C标准时,会使用到EOF的概念,EOF是End of File的缩写,在操作系统中资料源无更多资料可以读取,可以用来表示I/O的结束。在C语言中,C标准函数库中表示文件结束符,在while循环中,以EOF作为循环结束的标志。在C标准库中,EOF的定义如下:
#define EOF (-1)
对黑盒测试来说,所有的输入数据都是放到一个文件里的,系统会让程序去读取这个文件里的输入数据,然后执行并输出结果。如果题目没有指定何时结束输出,一般都是指输完所有数据为止。那对于这类题目,如何解决这种输入要求?
C语言标准库中,scanf() 函数平时作为一条语句使用,但它是有返回值的。scanf()函数的返回值为其成功读入的参数的个数。这就是说,如果语句scanf("%d", &num) 成功读入了一个整数,scanf的返回值就为1,如果scanf("%d%d", &n, &m) 成功读入了两个整数,scanf的返回值就为2。
只有在读取文件时达到文件末尾时导致的无法读取的现象,就会产生读取失败。这个时候,scanf() 函数会返回-1而不是0。根据C语言中EOF的定义,EOF的值为-1。所以,当题目没有明确说明需要读取多少数据时,就可以利用scanf()的返回值是否为EOF来判断输入是否结束。所以可以用以下写法:
while(scanf("%d", &n) != EOF){
···
}
C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
案例: ^1aa5ff
```C
#include <cstdio>
const int maxn = 200;
int set[maxn];
int main(){
int n, num, x;
while (scanf("%d", &n) != EOF)
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &num);
set[i] = num;
}
scanf("%d", &x);
int k;
for(k = 0; k < n; k++){
if (x == set[k])
{
printf("%d", k);
break;
}
}
if (k == n)
{
printf("%d", -1);
}
}
return 0;
}
上述程序要求分组输入,在使用了EOF的while循环,如果没有,则为死循环,在上述循环中,可以采用ctrl+z来终止循环。