对getchar()函数感到困惑

时间:2010-03-09 10:08:19

标签: c getchar

我对getchar()在以下代码中的角色感到困惑。我的意思是我知道它帮助我看到输出窗口,只有当我按 Enter 键时才会关闭。

所以getchar()基本上等着我按回车然后再读一个字符。

这个功能正在读取的单个字符是什么?我没有按下键盘上的任何键来阅读。

现在当它没有阅读任何内容时,为什么它不会出现错误,说“嘿,你没有输入任何东西供我阅读”?

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}

6 个答案:

答案 0 :(得分:11)

这是因为getchar()是阻止函数。

您应该阅读blocking functions,这基本上会使进程等待以便发生某些事情。

等待行为的实现取决于函数,但通常它是一个等待某些事件发生的循环。

对于getchar()函数的情况,这可能是作为循环实现的,它不断读取文件(本案例为stdin)并检查天气文件是否被修改。如果文件被修改,则循环通过执行其他操作来表现。

答案 1 :(得分:9)

getchar()函数只会等到它收到一个字符,然后保持该程序直到它为止。

按下回车键时会发送一个字符;在Windows操作系统下,它将发送回车(CR)和换行(LF)。

请参阅this CodingHorror post以获得一个很好的解释。

(...对CR + LF部分的解释,而不是getchar()阻止部分)

答案 2 :(得分:4)

试试这个:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char ch;

    printf("I'm now going to block until you press something and then return... ");

    ch = getchar();

    if (ch >= 0)
       printf("\nYou pressed %c\n", ch);
    else
       printf("\nAliens have taken over standard input! Run!\n");

    return 0;
}

getchar()将导致程序进入睡眠状态,直到收到键盘(或附加到stdin的任何内容)中断为止。这意味着它是阻塞的,在getchar()返回之前不会执行任何其他代码。

查看函数的返回值非常非常有用,以便了解它。

任何函数都可能会阻塞,除非它提供了一些防止阻塞的机制。例如,open()允许O_NONBLOCK标志,这有助于打开缓慢响应设备,如调制解调器。简而言之,如果它从终端获得输入或者必须等待从内核或某些设备获得答案,那么它很可能会被阻止。

答案 3 :(得分:2)

getchar()会阻止程序执行,直到按下某个键。因此,如果没有按下任何键就没有错误,getchar()将等待它发生:)

答案 4 :(得分:1)

您可以在此处详细了解getchar的行为: http://www.cppreference.com/wiki/c/io/getchar ......这应该回答你的问题:)

答案 5 :(得分:0)

我认为让您感到困惑的是,在程序继续运行之前需要Enter键。默认情况下,终端将缓冲所有信息,直到按Enter为止,甚至不将其发送到C程序。

请参阅discussion of Enter problem here