【问题标题】:Why doesn't this code need clearerr for feof?为什么这段代码不需要更清晰的 feof?
【发布时间】:2021-04-21 18:16:44
【问题描述】:

每个流都有一个“文件结束 (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 debugging stdin eof feof


【解决方案1】:

为什么这段代码不需要对 feof 更清晰?

您正在使用scanf

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

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

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

您不需要任何初始 clearerr,因为隐式 fopen - 或隐式初始化 - stdin(在调用 crt0 之前在 crt0 中完成;另见 fdopen)要么调用它或做类似的事情。

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

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

【讨论】:

  • stdin 的隐式 fopen - 或隐式初始化 - 要么调用它,要么执行等效操作。什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多