1

AC quiz 有这四个问题,涉及 fprintf 和 EOF。在与这些问题相关的课程部分中并没有真正解释它们,我在网上找不到很好的答案。

屏幕上打印的数字和/或编译失败的原因是 fprintf 的结果还是它与 EOF 的关系?

#include <stdio.h> 

int main(void) { 
    int i; 
    i = fprintf(stdin,"Hello!"); 
    printf("%d",i == EOF); 
    return 0; 
} 

答:程序输出1

#include <stdio.h> 

int main(void) { 
    int i; 
    i = fprintf(stderr,"Hello!"); 
    printf("%d",i == EOF); 
    return 0; 
}

答:程序输出0到stdout流

#include <stdio.h> 

int main(void) { 
    FILE *f; 
    int i = fprintf(f,"Hello!"); 
    printf("%d",i == EOF); 
    return 0; 
}

答:编译或执行失败

#include <stdio.h> 

int main(void) { 
    FILE *f = fopen("file","w"); 
    int i = fprintf(f,"Hello!"); 
    printf("%d",i != EOF); 
    return 0; 
}

答:程序输出1

4

1 回答 1

2

EOF 是一个通常等于-1 的宏。

  1. Q1:
    • stdin是输入流。因此在其上使用 fprintf 会产生冲突,显然是由fprintf()-1 处理并返回的。(如评论中所述,发生错误时的返回值可以是任何负数)。
    • 从这个意义上说,条件(i == EOF)返回 true,即 1。这解释了答案。
  2. Q2:
    • stderr是一个输出流,意味着打印到它是成功的
    • i = ...,i包含写入的字符数。>0
    • i == EOF评估为 0。
    • 0 被打印
  3. 第三季度:
    • fprintf尝试使用地址打印到流中f
    • f是一个带有垃圾值的指针,这意味着它可能指向操作系统拥有的内存。
    • 对该地址的写入导致编译或执行失败
  4. 第四季度:
    • fprintf完成它的工作并将 5 个字符写入文件f
    • i用值 5 初始化
    • i != EOF计算结果为5 != -1,为真, 存储为内存中的数字 1
    • 打印值为 1
于 2020-10-02T01:38:25.503 回答