提问人:Test Raw 提问时间:1/17/2021 更新时间:1/17/2021 访问量:102
为什么这段代码不需要 clearerr 用于 feof?
Why doesn't this code need clearerr for feof?
问:
每个流都有一个“文件结束 (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]);
}
}
答:
0赞
Basile Starynkevitch
1/17/2021
#1
为什么这段代码不需要 clearerr 用于 feof?
您正在使用 scanf。
您可以阅读现代 C,然后是 C 草案标准,例如 n1570 或更好,并查看此 C 参考网站。
该函数返回一个有趣的项目计数。scanf
失败时,它还会设置 feof 标志。
您不需要任何初始值,因为隐式 - 或隐式初始化 - (在调用之前在 crt0 中完成;另请参阅 fdopen)正在调用它或执行等效操作。clearerr
fopen
stdin
main
如果您使用 GNU/Linux 系统,那么所有 crt0
、GCC、Linux 内核和 GNU libc 都是开源或自由软件,您可以下载、研究甚至改进它们的源代码。
当然,请参阅Linux From Scratch。它记录了如何从源代码编译所有这些内容。另请阅读此相关答案,并考虑在您的笔记本电脑上安装 Debian。
评论
0赞
Test Raw
1/18/2021
stdin 的隐式 fopen 或隐式初始化要么调用它,要么执行等效操作。你是什么意思?
评论