代码:
#include <stdio.h>
#define NEWLINE '\n'
#define SPACE ' '
int main(void)
{
int ch;
int count = 0;
while((ch = getchar()) != EOF)
{
if(ch != NEWLINE && ch != SPACE)
count++;
}
printf("There are %d characters input\n" , count);
return 0;
}
问题:
一切正常,它将忽略空格和换行符,并将输入的字符数输出到屏幕上(在此程序中,我只将逗号,感叹号,数字或任何可print的特殊符号字符(例如与号)视为字符 也是如此)当我点击
^z
的EOF模拟时但是当我在程序中输入这一行时出了点问题.例如,我输入以下内容:
abcdefg^z
,这表示我在^z
之前和同一行输入了一些字符 .该程序将继续要求输入,而不是终止程序并print出总字符。仅当我指定
^z
时,EOF终止字符输入才有效 在一行上或通过执行以下操作:^zabvcjdjsjsj
.为什么会这样?
最新回答
- 2021-1-111 #
- 2021-1-112 #
^v
仅当在行首键入时,控制台才将它转换为程序的EOF信号.这就是windows控制台的工作方式.我所知道的这种行为没有"解决方法"。^Z
几乎在每个终端驱动程序中都是如此.使用Linux,您将获得相同的行为.
您的程序直到
\n
才真正执行循环 或^z
您已在行尾输入.终端驱动程序正在缓冲输入,直到发生输入才将其发送到您的进程。在一行的结尾,点击
^z
(或^d
在Linux上)not不会导致终端驱动程序发送EOF.它只会使它刷新缓冲区到您的进程(没有\n
).打威兹维兹 (或
^z
在Linux上)在行首被终端解释为"我想发信号EOF"。如果在循环中添加以下内容,则可以观察到此行为:
运行程序:
要更好地理解这一点,您必须意识到EOF不是字符.
$ ./test abc <- type "abc" and hit "enter" 97 98 99 10 abc97 <- type "abc" and hit "^z" 98 99
是用于终端本身的用户命令.因为终端负责接收用户输入并将其传递给流程,所以这变得很棘手,从而造成混乱.一种查看方式是点击
^z
然后点击^v
作为程序的输入。^z
是另一个告诉终端的终端命令,"嘿,我键入的下一件事-不要将其解释为终端命令;而是将其传递到进程的输入"。