getchar读取ctrl+z还是返回EOF?

问题描述 投票:0回答:1

我有这个代码:

#include <stdio.h>

int main(void) {

int d=0;

d = getchar();
printf("%d\n", d);

}

输出:

^Z
-1

据我了解,这里可能发生两件事:

  1. Getchar 读取 ctrl+z 并返回它。
  2. Getchar 不读取任何内容并返回 EOF。

还有更多的可能性吗?这两种哪个是正确的?

c windows eof getchar
1个回答
0
投票

这有两个部分:

  1. getchar()
    做什么。
  2. 控制台/操作系统/运行时环境的作用。

getchar()
的作用很明确:

如果发生任何失败,则返回 EOF (-1)。如果失败是由文件结尾引起的,则另外设置 eof 指示符(请参阅标准输入上的

feof()
)。

操作系统控制台在这种情况下执行的操作 (Windows):

  1. 接收输入Ctrl-Z(非打印ASCII控制字符26)
  2. 将非打印 Ctrl-Z 回显为
    ^Z
  3. 将 Ctrl-Z 捕获为 EOF 并将 EOF 插入到 stdin(不是 Chr.26)。

注意 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()
之一后恢复输入。

© www.soinside.com 2019 - 2024. All rights reserved.