问题描述
在下面给出的代码段中。每当我输入一组以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表图表表示26为/ substitute /。我不知道那是什么意思 谢谢。
解决方法
Ctrl + Z是ASCII control character,例如Ctrl + A,Ctrl + B,Ctrl + @等。不是EOF
。 EOF
与任何字符都不同:否则,如果getchar()
返回该值,您将无法知道它是否已到达文件末尾或已读取该字符。 Ctrl + Z的ASCII值为26。您正在查看键入的内容。
在您的操作系统(大概是Windows)上,每行开头的Ctrl + Z表示已输入完终端。 (更确切地说,我认为代码位于从终端读取的库函数中,而不是从终端本身读取的库函数中。但是由于我不是Windows专家,我在细节上可能是错误的。)它仅在开始时有效行,因为这是从终端读取的库代码的工作方式。在行的开头键入Ctrl + Z时,getchar()
会看到文件结束的情况并返回EOF
。
当您在一行的开头键入Ctrl + Z not 时,它将被视为普通字符。 Windows将其打印为“奇怪的字形”,用于表示不可打印的字符。
大多数ASCII字符的正式含义早已被人们遗忘。有一个ASCII控制字符,曾经用来表示“文件结尾”,或更确切地说是“ end of transmission”,即Ctrl + D,并且在Unix操作系统家族中幸存下来时表示“输入结尾”。在终端行的开头输入的内容,类似于Windows上的Ctrl + Z。 Windows上的association of Ctrl+Z with end-of-file来自不同的操作系统历史沿线,主要来自DEC,这是微软的DOS和Windows的灵感来源。
与您提出的问题不完全相同,但是我建议您使用this answer,这应该有助于消除您对EOF
的困惑。