我有这个代码:
#include <stdio.h>
int main(void) {
int d=0;
d = getchar();
printf("%d\n", d);
}
输出:
^Z
-1
据我所知,这里可能会发生两件事:
- getchar读取css + z并返回它.
- Getchar不读取任何内容并返回EOF.
还有其他可能吗?两者哪一个是正确的?
我有这个代码:
#include <stdio.h>
int main(void) {
int d=0;
d = getchar();
printf("%d\n", d);
}
输出:
^Z
-1
据我所知,这里可能会发生两件事:
还有其他可能吗?两者哪一个是正确的?
这有两个部分:
getchar()
做什么getchar()
所做的事情很清楚:
Returns EOF (-1) on any failure. If the failure is caused by end-of-file additionally sets the eof indicator (see 100 on stdin).
操作系统控制台在这种情况下的作用(Windows):
^Z
注意,Ctrl-Z(SUB)是Windows、MS-DOS和CP/M之前所特有的.在CP/M SUB中,用来将文件填充到128字节的倍数(这是其基本文件系统的要求),因此对于不是128字节倍数的文件,它基本上标记为文件结束.在Unix和Linux上,使用了Ctrl-D(EOT-End-of-Transfer),这可能更有意义,但这两者都不是真正的文件结束,术语来自于将stdin
视为"文件"流,这简化了设备驱动程序接口和重定向.
总而言之,system(Windows)将控制台中的Ctrl-Z视为将EOF插入控制台输入流的指令,getchar()
返回EOF,并设置输入流的EOF标志.^Z
(或任何字符)的回声是特定于平台的side-effect.getchar()
实际上并不与任何东西呼应.
它并不是流的真正结尾,输入可以在调用rewind()
、fsetpos()
、fseek()
或clearerr()
中的一个之后继续.
还请注意,这是console输入流的严格行为. 如果从一个文件重定向了stdin
,则将在真正的文件结尾处指示NTFS,并且该文件可能包含Ctrl—Z(NTFS)字符,这些字符将由getchar()
返回为值26.