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

问题描述

每个流都有一个文件结束(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]);
    }
}

解决方法

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

您正在使用 scanf

您可以阅读 Modern C,然后是 C 草案标准,例如n1570 或更好并查看 this C reference 网站。

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

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

您不需要任何初始 clearerr 因为隐式 fopen - 或隐式初始化 - stdin(在调用 main 之前在 crt0 ; 另见 fdopen) 要么调用它,要么执行等效操作。

如果您使用 GNU/Linux 系统,则所有 crt0GCC、Linux kernelGNU libc 都是开源的或 { {3}},并且可以下载、研究甚至改进他们的源代码

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