提问人:Onederfoo 提问时间:10/2/2020 最后编辑:John KugelmanOnederfoo 更新时间:10/2/2020 访问量:386
C 语言中 stdin 和 EOF 的关系
Relation of stdin and EOF in C
问:
C 测验有这四个问题,涉及 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
答:
2赞
Pixel_teK
10/2/2020
#1
EOF 是一个宏,通常等于 -1。
- 问1 :
stdin
是输入流。因此,在它上面使用 fprintf 会产生冲突,该冲突显然是由 -1 处理并返回的。(如注释中所述,发生错误时的返回值可以是任何负数)。fprintf()
- 从这个意义上说,条件返回 true,即 1。这解释了答案。
(i == EOF)
- 问2 :
stderr
是一个输出流,这意味着打印到其中是成功的i = ...
,包含写入的字符数。>0i
i == EOF
计算结果为 0。- 0 已打印
- 问3 :
fprintf
尝试打印到带有地址的流中f
f
是具有垃圾值的指针,这意味着它可能指向操作系统拥有的内存。- 写入该地址导致编译或执行失败
- 问4 :
fprintf
完成其工作并将 5 个字符写入文件中f
i
使用值 5 进行初始化i != EOF
计算结果为 ,为 true,则在内存中存储为数字 15 != -1
- 打印值为 1
评论
1赞
Onederfoo
10/2/2020
这是一个很好的信息,完全回答了我的问题。谢谢
评论
EOF
fprintf()
f
fprintf()
stdin
仅对读取开放,无法写入,因此会出现错误。