关于getchar()函数感到困惑

16

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

因此,getchar() 基本上在等待我按下回车键,然后读取一个字符。

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

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

#include <stdio.h>

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

2
getchar()会一直等待,直到按下一个键。它是你的仆人。 - N 1.1
4
欢迎来到stackoverflow!新手提问完全没有问题,只要它们符合主题。你的问题实际上是一个相当好的问题,因为它涉及到一个重要的概念。 - sleske
1
请尽量让您的标题与问题主题相关,这将有助于正在寻找类似内容的其他人。我已编辑您的标题以反映问题。欢迎来到Stack Overflow :) - Tim Post
谢谢你的欢迎 :) 我会记住你关于标题相关性的建议。很高兴今天找到了这个网站..一直在寻找一个可以快速回答我的问题的地方...我得到的所有答案都非常有帮助..感谢你们所有人 :) - Serenity
6个回答

11

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

你可以了解一下 阻塞函数,它们基本上会使进程等待某些事件的发生。

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

对于 getchar() 函数来说,这可能是一个循环,不断地读取文件(在此情况下是标准输入设备),并检查文件是否被修改。如果文件被修改,循环将通过执行其他操作来响应。


我想我也会研究一下它们。根据用户的描述,这更像是事件监听器还是中断(或两者都不是,而我是一个愚蠢的问题提出者)? - Anthony
@Anthony:内部实现不同:当您直接访问硬件(例如从串口读取)时,通常会使用中断驱动。如果您在GUI环境下从控制台窗口读取,则getchar可能会收到GUI框架的某种事件。 - sleske

9
getchar()函数会等待接收一个字符,直到接收到为止,这将导致程序停滞。
当您按下回车键时,会发送一个字符;在Windows操作系统下,它会发送回车符(CR)和换行符(LF)。
有关CR + LF部分的解释,请参见此CodingHorror帖子,其中对其进行了很好的解释。 (... CR + LF部分的解释,而不是getchar()阻塞部分)

感谢您发布链接。 - Rob L

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;
}

getchar()函数会让程序休眠,直到接收到键盘(或者连接到标准输入的任何设备)中断。这意味着它是阻塞的,只有当getchar()返回时才会执行其他代码。

查看一个函数的返回值非常有帮助,可以更好地理解它。

除非提供某种机制来防止阻塞,否则任何函数都可能会被阻塞。例如,open()允许使用O_NONBLOCK标志,这对于打开响应速度较慢的设备如调制解调器非常有用。简而言之,如果从终端获取输入或必须等待内核或某个设备的答复,则很有可能会发生阻塞。


2

getchar()会阻塞程序的执行,直到用户按下一个键。因此,如果没有按键被按下,getchar()不会出错,它会一直等待。


1

0

我认为让你困惑的是在程序继续之前需要按下回车键。默认情况下,终端会缓存所有信息,直到按下回车键才将其发送给C程序。

请参见此处有关回车键问题的讨论


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接