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