gpt4 book ai didi

c - Windows 命令提示符中的 EOF 不会终止输入流

转载 作者:太空狗 更新时间:2023-10-29 17:05:26 27 4
gpt4 key购买 nike

代码:

#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;
}

问题:

  1. 一切正常,它会忽略空格和换行符并输出输入到屏幕的字符数(在这个程序中,我只将逗号、感叹号、数字或任何可打印的特殊符号字符(如&符号)视为字符也是)当我点击 ^z 的 EOF 模拟时。

  2. 但是当我向程序输入这一行时出现了错误。例如我输入了这个:abcdefg^z,这意味着我在 ^z 之前和同一行输入了一些字符。该程序不会终止程序并打印出总字符数,而是会继续要求输入。

  3. EOF 终止字符输入仅在我在单行上指定 ^z 或通过执行以下操作时有效:^zabvcjdjsjsj。为什么会这样?

最佳答案

几乎每个终端驱动程序都是如此。使用 Linux 时您会得到相同的行为。

直到您在行尾输入 \n^z 后,您的程序才真正执行循环。终端驱动程序正在缓冲输入,直到发生这种情况才将其发送到您的进程。

在一行的末尾,点击 ^z(或 Linux 上的 ^d)不会导致终端驱动程序发送 EOF .它只会将缓冲区刷新到您的进程(没有 \n)。

在一行的开头点击 ^z(或 ^d 在 Linux 上)被终端解释为“我想发出 EOF 信号”。

如果在循环中添加以下内容,您可以观察到此行为:

printf("%d\n",ch);

运行你的程序:

$ ./test
abc <- type "abc" and hit "enter"
97
98
99
10
abc97 <- type "abc" and hit "^z"
98
99

为了更好地理解这一点,您必须认识到 EOF 不是一个字符。 ^z 是终端本身的用户命令。因为终端负责获取用户输入并将其传递给进程,所以这会变得棘手,从而造成困惑。

一种查看方式是点击 ^v 然后点击 ^z 作为程序的输入。

^v 是另一个终端命令,它告诉终端,“嘿,我输入的下一个内容 - 不要将其解释为终端命令;而是将它传递给进程的输入”。

关于c - Windows 命令提示符中的 EOF 不会终止输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7373386/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com