我正在尝试下eof和getchar()

I am trying to under eof and getchar ()

在下面给出的代码段中。每当我在末尾输入一组带有 ctrl+z 的字符时,应该将 EOF 标记为 getchar()。它打印所有字符以及最后一个 ASCII 值为 26 的字符。我不知道这个字符的名称。

我希望程序在我按下 ctrl+z 的地方结束。然而,Ctrl+z 仅在输入流为空时有效。

有人可以解释为什么它返回这样一个尴尬的字符而不是结束程序吗?

#include<stdio.h>
#include<ctype.h>

int main(){

   int c;

   while((c = getchar()) != EOF)
       putchar(c);

   return 0;
}

抱歉,我无法上传图片,我也无法显示值为 26 的字符。ASCII table 图表显示 26 是 /substitute/。我不知道那是什么意思。 谢谢。

Ctrl+Z 与 Ctrl+A、Ctrl+B、Ctrl+@ 等类似 ASCII control character。不是EOFEOF 不同于任何字符:否则,如果 getchar() 返回该值,您无法知道它是否已到达文件末尾或已读取该字符。 Ctrl+Z 的 ASCII 值是 26。您看到的是您输入的内容。

在您的操作系统上(Windows,大概),行首的 Ctrl+Z 向终端指示您已完成输入。 (更准确地说,我认为代码在从终端读取的库函数中,而不是从终端本身读取的。但我在细节上可能是错误的,因为我不是 Windows 专家。)它只是在一行的开头工作,因为这就是从终端读取的库代码的工作方式。当您在行首键入 Ctrl+Z 时,getchar() 会看到 end-of-file 条件并且 returns EOF.

当您在行首键入 Ctrl+Z not 时,它被视为普通字符。 Windows 将其打印为“奇怪的字形”,用于指示不可打印的字符。

大多数 ASCII 字符的官方含义很久以前就被遗忘了。有一个 ASCII 控制字符曾经表示“文件结尾”,或者更准确地说“Windows 上的 end of transmission”, which is Ctrl+D, and it survives in the Unix operating system family to mean “end of input” when entered at the beginning of a line on a terminal, much like Ctrl+Z on Windows. The association of Ctrl+Z with end-of-file 来自不同的操作系统历史系列,主要来自 DEC,Microsoft 的 DOS 和 Windows 从中汲取灵感。

与您的问题不完全相同,但我建议 这应该有助于消除您对 EOF 的困惑。