对getchar()函数感到困惑

Ser*_*ity 16 c getchar

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

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

这个函数读取的单个字符是什么?我没有按键盘上的任何键来阅读.

现在当它没有读任何东西的时候,为什么它没有给出一个错误,说"嘿,你没有输入任何东西供我阅读"?

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*eis 11

那是因为getchar()是一个阻塞函数.

您应该阅读有关阻塞函数的内容,这些内容基本上会使进程等待某些事情发生.

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

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


det*_*tly 9

getchar()函数将一直等到收到一个字符,然后保持该程序直到它.

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

请参阅此CodingHorror帖子以获得精美的解释.

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


小智 5

尝试这个:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

查看函数的返回值以理解它是非常非常有帮助的。

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