2014-03-13 52 views
1

执行而如果我有以下几点:用getchar函数

while (getchar() != 'y') 
    printf("some..."); 

我想知道,如果while测试字符只有当缓冲区为空。

所以,如果我输入

abcdy[enter] 

那么[enter]while执行?

getchar本身是while要测试何时按下输入?

+5

您是否尝试过运行该程序? – Ryan

+0

@minitech,是的,它的工作原理。为什么? – xdevel2000

回答

2

getchar是一个阻塞调用,即它将等待,直到你给它输入。

+0

所以在冲洗缓冲区之后,执行...并处理我输入的所有字符...... – xdevel2000

0

getchar()块在系统级。

虽然getchar()被封锁,只要按下几个按键,移动鼠标,切换窗口,有啤酒,...,...

getchar()当你键入回车在正确的窗口将解除。然后你的程序会连续看到所有击键,直到并包括ENTER。

+0

不,它将在任何*按键上解除阻止。你正在考虑'gets' –

+0

我不使用'gets()'!它不是阻塞的'getchar()',它是阻塞(并缓冲字符)的操作系统。 – pmg

1

“试试看看”可以告诉你什么是事情,但不是它是什么应该要做。

在这种情况下,while环路的行为是从代码明显的:它会继续直到getchar返回值'y';当getchar返回'\n'EOF'y'以外的任何内容时它不会停止。

对于getchar自身的行为,从终端阅读,基本上有三种情况担心:

  1. 如果事情已经键入但尚未阅读,getchar将返回一个字符。 getchar本身并不在乎行界限; 输入导致它返回'\n'。但是,终端(仿真器)只能以整行的形式向程序提供输入,具体取决于它所处的模式,因此,如果用户键入了abc,但尚未输入,则输入您实际上可能处于状态3(如下)。

  2. 如果终端已经被关闭(或通过键入^d伪闭合)和所有输入到这一点已被读取,getchar将返回EOF,这不等于任何字符值。它会一遍又一遍地重复,直到应用程序停止调用它。您的代码是越野车因为它不检查EOF:如果终端关闭,它将永久卡在循环中。 (由于正常运行程序,这可能并不明显,因为关闭一个终端会立即发送一个SIGHUP信号,它将(默认情况下)终止进程。尝试运行它作为./a.out < /dev/null以查看无限循环。)

  3. 如果所有输入的内容都已被读取,但终端仍处于打开状态,则在发生更多打字或终端关闭之前,getchar将不会返回。底层的read系统调用被称为,这意味着内核将CPU从您的进程中分离出来,直到更多的输入变为可用(并让其他程序执行;它不是一个等待输入的旋转循环,正如人们可能想象的那样一个用于在DOS下的kbhit/getch)。

+0

*“您的代码有问题,因为它不检查EOF:如果终端关闭,它将永久卡在循环中。”*它通常不会终止挂断信号吗? – Ryan

+0

@minitech Yah,我可能试图掩盖不相关的细节太难。请参阅编辑。 – zwol