17

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

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

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

现在,当它没有读取任何内容时,为什么它不会给出错误提示“嘿,您没有输入任何内容供我阅读”?

#include <stdio.h>

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

6 回答 6

11

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

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

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

对于getchar()函数的情况,这可能是作为一个循环来实现的,该循环不断地读取文件(本例为标准输入)并检查文件是否被修改。如果文件被修改,则循环会执行其他操作。

于 2010-03-09T10:11:23.517 回答
9

getchar()函数将简单地等待,直到它接收到一个字符,直到它接收到为止。

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

请参阅此 CodingHorror 帖子以获得很好的解释。

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

于 2010-03-09T10:12:13.713 回答
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()将导致您的程序进入睡眠状态,直到收到键盘(或附加到标准输入的任何东西)中断。这意味着它是阻塞的,在返回之前不会执行其他代码getchar()

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

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

于 2010-03-09T10:20:08.143 回答
2

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

于 2010-03-09T10:12:00.380 回答
1

您可以在此处了解有关 getchar 行为方式的更多信息: http ://www.cppreference.com/wiki/c/io/getchar ...这应该可以回答您的问题:)

于 2010-03-09T10:12:26.103 回答
0

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

请参阅此处输入问题的讨论

于 2019-05-17T08:59:59.417 回答