2010-03-09 108 views
16

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

所以getchar()基本上是等待我按下输入,然后读取一个字符。

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

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

#include <stdio.h> 

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

getchar()会一直等待,直到按下一个键。它是你的仆人。 –

+4

欢迎来到stackoverflow!新手的问题在这里完全没问题,只要他们不在话题上。你的问题实际上是一个很好的问题,因为它解决了一个重要的概念。 – sleske

+1

请尽量让题目贴近问题的主题,它会帮助其他正在寻找类似内容的人。我已经编辑过您的标题以反映问题。欢迎来到堆栈溢出:) –

回答

8

getchar()函数将等待,直到它收到一个字符,直到它保持程序。

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

请参阅this CodingHorror post以获得很好的放置解释。

(...的CR + LF一部分,而不是getchar()阻塞部分的说明)

+0

感谢您发布该链接。 –

11

这是因为的getchar()是一个阻塞功能。

您应该阅读约blocking functions,这基本上使的过程等待的事情发生。

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

对于getchar()函数的情况,这可能是作为一个不断读取文件的循环(针对这种情况的stdin)并检查文件被修改的天气。如果该文件被修改,则该循环通过执行其他操作来执行。

+0

我想我我也会读到他们。那(基于用户的描述)更像是一个事件监听器还是一个中断(或者两者都不是,而我是那个有哑巴问题的人)? – Anthony

+0

@Anthony:内部实现有所不同:当你直接访问HW(如从串口读取数据时),它通常是中断驱动的。如果您在GUI环境中从控制台窗口读取数据,getchar可能会从GUI框架接收某种事件。 – sleske

2

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

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()会导致你的程序去睡觉,直到柯yboard(或任何附加到标准输入)中断被接收。这意味着它被阻塞,直到getchar()返回时才会执行其他代码。

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

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