为什么这个getchar()循环在输入一个字符后停止?

时间:2010-03-17 13:55:56

标签: c getchar

#include <stdio.h>

int main() {
    char read = ' ';

    while ((read = getchar()) != '\n') {
        putchar(read);
    }

    return 0;
}

我的输入是f(当然是输入)。我希望getchar()再次请求输入,但程序终止。怎么会?我该如何解决这个问题?

5 个答案:

答案 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)

在你输入'/ n'之后输入'

。 所以循环结束了。 如果你想要另外一个角色,只要按下回车就继续将它们一个接一个地放在上面。

答案 3 :(得分:1)

你已经对它进行了编程,所以当你读到\ n(输入)时循环结束,然后你返回0;从main退出程序。

也许你想要像

这样的东西
 while ((read = getchar()) != EOF) {
        putchar(read);
    }

答案 4 :(得分:0)

n x终端上,您可以按Control-D,它将告诉tty驱动程序将输入缓冲区返回给读取它的应用程序。这就是为什么新行上的^ D结束输入 - 它导致tty返回零字节,应用程序将其解释为文件结尾。但它也适用于任何地方。