我想通过输入,EOF(在Windows中为^ Z)终止我的输入,这是程序:
#include<stdio.h>
#include<conio.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF)
{
if (c == '\t')
{
putchar('\\');
putchar('t');
}
else if (c == '\b')
{
putchar('\\');
putchar('b');
}
else if (c == '\\')
{
putchar('\\');
putchar('\\');
}
else if (c == '\r')
{
puts("\\n");
// putchar('\n');
}
else{
putchar(c);
}
}
return 0;
}
这是我的输入和输出: 所以我在问:为什么我不能通过第一个^ Z来终止我的输入?否则说明为什么我必须输入enter来创建一个新行,以便通过输入^ Z来终止我的输入?
答案 0 :(得分:2)
参见以下讨论:
read()
from stdin
doesn't ignore newline 在Unix上, Control-D (默认情况下)等同于Windows上的 Control-Z 。
所有人都指出,第一次键入 Control-Z 时,已经在输入中累积的输入被发送到程序(没有换行符);发送的字符数非零,因此还没有EOF。第二次,在行的开头键入 Control-Z ,程序获取零字节进行读取,这被解释为EOF。
答案 1 :(得分:1)
没有真正的理由超越&#34;它是如何运作的&#34;。你可以按 F6 。这将被视为发出文件结束信号,即使它没有输入。
你必须按 F6 和输入的原因相当简单:这里涉及两个独立的代码片段。操作系统有一个小的(有些瘫痪的)编辑例程,可以让您输入一行数据。它具有处理后退空间的代码以及类似的一些内容,因此您可以在输入数据时使用它们,即使您的代码根本不包含任何编辑功能。该例程会向您的程序返回一行文本,但仅当您输入已编程的内容时,&#34;想到&#34;作为一个完整的行 - 只有在按下 enter 时才会发生。
一旦操作系统读入了满载数据的缓冲区,它就会被发送到您的程序。你的程序查看内容,当它/如果找到 ctrl + Z 时,它会将其视为发出文件结尾的信号。但是,由于文件处理的结束是由您的程序完成的,而不是操作系统的编辑程序,因此在您按下后才能进行感知
如果您真的不喜欢这种行为,大多数操作系统确实提供了一些无缓冲读取的方法。确切的方式因操作系统而异。一个Windows,您可以使用_getch
。大多数基于Unix的系统在Curses库中提供大致相同的功能(如果你想使用它,那么至少还有一个免费的Windows curses实现)。