我有这个代码:
#include <stdio.h>
int main(void) {
int d=0;
d = getchar();
printf("%d\n", d);
}
输出:
^Z
-1
据我了解,这里可能发生两件事:
还有更多的可能性吗?这两种哪个是正确的?
这有两个部分:
getchar()
做什么。getchar()
的作用很明确:
如果发生任何失败,则返回 EOF (-1)。如果失败是由文件结尾引起的,则另外设置 eof 指示符(请参阅标准输入上的
feof()
)。
操作系统控制台在这种情况下执行的操作 (Windows):
^Z
注意 Ctrl-Z (SUB) 是 Windows、MS-DOS 以及之前的 CP/M 所特有的。在 CP/M 中,SUB 用于将文件填充到 128 字节的倍数(其原始文件系统的要求),因此对于不是 128 字节的倍数的文件,它本质上标记了文件结尾。在 Unix 和 Linux 上,使用 Ctrl-D(EOT - 传输结束),这可以说更有意义,但两者都不是真正的文件结束,该术语来自将
stdin
视为“文件”流,这简化了设备驱动程序接口和重定向。
总而言之,系统(Windows)将控制台中的Ctrl-Z视为将EOF插入标准输入流的指令,并且
getchar()
返回EOF,并设置输入流的EOF标志。
这并不是真正的流结束,并且可以在调用
rewind()
、fsetpos()
、fseek()
或 clearerr()
之一后恢复输入。