#include <stdio.h>
int main() {
char read = ' ';
while ((read = getchar()) != '\n') {
putchar(read);
}
return 0;
}
我的输入是f
(当然,后面是输入)。我希望getchar()
再次要求输入,但程序被终止了。怎么会?我怎样才能解决这个问题?
终端有时会有点混乱。您应该将程序更改为:
#include <stdio.h>
int main() {
int read;
while ((read = getchar()) != EOF) {
putchar(read);
}
return 0;
}
这将一直读取,直到 getchar 从终端读取 EOF(大多数情况下,此宏扩展为 -1)。getchar 返回一个 int,因此您应该将变量“读取”为整数,以便检查 EOF。您可以在 Linux 上使用 ^D 从终端发送 EOF,我认为在 Windows 上使用 ^Z (?)。
稍微解释一下会发生什么。在您的程序中,表达式
(read = getchar()) !='\n'
只要没有从缓冲区中读取 '\n' 就为真。问题是,要获得程序的缓冲区,您必须按与“\n”相对应的回车键。在终端中调用您的程序时会发生以下步骤:
~$\a.out
这将启动您的程序
(empty line)
getchar() 进行系统调用以从终端获取输入,然后终端接管
f
您在终端中进行了输入。'f' 被写入缓冲区并在终端上回显,您的程序还不知道该字符。
f
f~$
你按回车。您的缓冲区现在包含“f\n”。“输入”还向终端发出信号,表明它应该返回到您的程序。您的程序读取缓冲区并找到 f 并将其放在屏幕上,然后找到一个 '\n' 并立即停止循环并结束您的程序。
这将是大多数终端的标准行为。您可以更改此行为,但这取决于您的操作系统。
getchar() 从输入流中返回下一个字符。这当然也包括换行符等。除非您按“Enter”,否则您看不到循环中的进度这一事实是由于您的文件 I/O(在标准输入上工作)没有移交输入缓冲区到 getchar() 除非它检测到缓冲区末尾的 '\n'。您的例程首先阻止然后一次处理两个击键,像您指定的那样终止,在输入流中出现 '\n' 。Facit:getchar() 不会从输入流中删除 '\n'(为什么要删除?)。
在 f 之后,您输入“enter”,即“/n”。所以循环在那里结束。如果你想取另一个角色,只要按下 enter 就继续将它们一个接一个地放置,循环退出。
您已经对其进行了编程,因此当您读取 \n (输入)时循环结束,然后您返回 0; from main 退出程序。
也许你想要类似的东西
while ((read = getchar()) != EOF) {
putchar(read);
}
在n x 终端上,您可以按 Control-D,这将告诉 tty 驱动程序将输入缓冲区返回给正在读取它的应用程序。这就是为什么 ^D 在新行结束输入 - 它导致 tty 返回零字节,应用程序将其解释为文件结尾。但它也适用于线路上的任何位置。