问题描述
每个流都有一个“文件结束(EOF)标志”。 仅当您在流上调用 clearerr 函数时才会清除该标志。 feof(p) 函数返回这个 EOF 标志的当前状态。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
int i=0;
int arr[100];
while(1){
scanf("%d",&arr[i]);
if(feof(stdin)){
break;
}
i++;
}
int j;
for(j=0;j<i;j++){
printf("%d ",arr[j]);
}
i=0;
printf("\n");
while(1){
scanf("%d",&arr[i]);
if(feof(stdin)){
break;
}
i++;
}
for(j=0;j<i;j++){
printf("%d ",arr[j]);
}
}
解决方法
为什么这段代码不需要 feof 的 clearerr?
您正在使用 scanf。
您可以阅读 Modern C,然后是 C 草案标准,例如n1570 或更好并查看 this C reference 网站。
那个 scanf
函数返回一个有趣的项目计数。
失败时,它还设置 feof 标志。
您不需要任何初始 clearerr
因为隐式 fopen
- 或隐式初始化 - stdin
(在调用 main
之前在 crt0 ; 另见 fdopen) 要么调用它,要么执行等效操作。
如果您使用 GNU/Linux 系统,则所有 crt0
、GCC、Linux kernel 和 GNU libc 都是开源的或 { {3}},并且您可以下载、研究甚至改进他们的源代码。
当然见free software。它记录了如何从源代码编译所有这些。另请阅读 Linux From Scratch 相关答案并考虑在您的笔记本电脑上安装 this。