为什么这段代码不需要 clearerr 用于 feof?

Why doesn't this code need clearerr for feof?

提问人:Test Raw 提问时间:1/17/2021 更新时间:1/17/2021 访问量:102

问:

每个流都有一个“文件结束 (EOF) 标志”。 仅当您在流上调用 clearerr 函数时,才会清除该标志。 feof(p) 函数返回此 EOF 标志的当前状态。

https://ibb.co/zGNcCZp

#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]);
    }
}
C 调试 stdin eof feof

评论

0赞 tripleee 2/4/2021
由于多种原因,代码或错误消息的图像存在问题。请查看 meta.stackoverflow.com/questions/303812/...编辑您的问题以将屏幕截图替换为文本。

答:

0赞 Basile Starynkevitch 1/17/2021 #1

为什么这段代码不需要 clearerr 用于 feof?

您正在使用 scanf

您可以阅读现代 C,然后是 C 草案标准,例如 n1570 或更好,并查看此 C 参考网站。

该函数返回一个有趣的项目计数。scanf

失败时,它还会设置 feof 标志。

您不需要任何初始值,因为隐式 - 或隐式初始化 - (在调用之前在 crt0 中完成;另请参阅 fdopen)正在调用它或执行等效操作。clearerrfopenstdinmain

如果您使用 GNU/Linux 系统,那么所有 crt0GCC、Linux 内核GNU libc 都是开源或自由软件您可以下载、研究甚至改进它们的源代码

当然,请参阅Linux From Scratch。它记录了如何从源代码编译所有这些内容。另请阅读相关答案,并考虑在您的笔记本电脑上安装 Debian

评论

0赞 Test Raw 1/18/2021
stdin 的隐式 fopen 或隐式初始化要么调用它,要么执行等效操作。你是什么意思?