#include <stdio.h>
int main() {
char read = ' ';
while ((read = getchar()) != '\n') {
putchar(read);
}
return 0;
}
我的输入是 f
(当然后面跟着一个 enter)。我希望 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”。 'enter' 也向终端发出信号,它应该返回到您的程序。你的程序 读取缓冲区并找到 f 并将其放到屏幕上,然后找到 '\n' 并立即停止循环并结束程序。
这是大多数终端的标准行为。您可以更改此行为,但这取决于您的操作系统。
关于c - 为什么这个 getchar() 循环在输入一个字符后停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2462728/