对getchar()函数感到困惑

对getchar()函数感到困惑,c,getchar,C,Getchar,我对以下代码中的getchar()角色感到困惑。我的意思是,我知道这有助于我看到输出窗口,只有当我按下回车键时,输出窗口才会关闭 所以getchar()基本上是在等待我按enter键,然后读取单个字符 此函数正在读取的单个字符是什么?我没有按键盘上的任何键让它阅读 现在,当它不阅读任何内容时,为什么它不给出一个错误,说“嘿,你没有输入任何内容让我阅读” #包括 int main() { printf(“废话”); getchar(); 返回0; } 这是因为getchar()是一个阻塞函数 你应

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

所以
getchar()
基本上是在等待我按enter键,然后读取单个字符

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

现在,当它不阅读任何内容时,为什么它不给出一个错误,说“嘿,你没有输入任何内容让我阅读”

#包括
int main()
{
printf(“废话”);
getchar();
返回0;
}
这是因为getchar()是一个阻塞函数

你应该读一读,这基本上让过程等待一些事情发生

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

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

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

函数将简单地等待,直到它接收到一个字符,并将程序一直保持到接收到为止

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

请参阅,以获得一个很好的解释


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

您可以在此处了解有关getchar行为的更多信息: …这应该能回答您的问题:)

试试这个:

#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;
}
#包括
int main(int argc,char*argv[])
{
char ch;
printf(“我现在要阻止,直到你按下某个按钮,然后返回…”);
ch=getchar();
如果(ch>=0)
printf(“\n您按了%c\n”,ch);
其他的
printf(“\n用户已接管标准输入!运行!\n”);
返回0;
}
getchar()
将导致程序进入睡眠状态,直到收到键盘(或连接到stdin的任何东西)中断。这意味着它处于阻塞状态,在
getchar()
返回之前不会执行其他代码

为了理解函数的返回值,查看函数的返回值非常有帮助


任何函数都可能阻塞,除非它提供某种机制来防止阻塞。例如,
open()。简而言之,如果它从终端获得输入,或者必须等待从内核或某个设备获得答案,它很有可能会被阻塞。

我想让你困惑的是,在程序继续之前需要输入键。默认情况下,终端将缓冲所有信息,直到按下Enter键,然后再将其发送到C程序


请参见

getchar()将无限期地等待,直到按下一个键。是你的仆人,欢迎来到这里!新手的问题在这里是完全可以的,只要它们是关于主题的。你的问题实际上是一个相当好的问题,因为它涉及到一个重要的概念。请尽量让你的标题靠近问题的主题,它将帮助其他正在寻找类似内容的人。我编辑了你的标题以反映这个问题。欢迎使用Stack Overflow:)谢谢您的欢迎:)我会记住您所说的标题相关性。很高兴今天我找到了这个网站。很久以来我一直在寻找一个可以很快回答我问题的网站。我得到的所有答案都非常有帮助。感谢你们所有人:)我想我也会仔细阅读它们的。这(根据用户的描述)更像是一个事件监听器还是一个中断(或者两者都不是,我是那个有愚蠢问题的人)?@Anthony:内部实现不同:当您直接访问硬件(如从串行端口读取)时,它通常是中断驱动的。如果您在GUI环境中从控制台窗口读取,getchar可能会从GUI框架接收某种类型的事件。感谢您发布此链接。
#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;
}