执行而如果我有以下几点:用getchar函数
while (getchar() != 'y')
printf("some...");
我想知道,如果while
测试字符只有当缓冲区为空。
所以,如果我输入
abcdy[enter]
那么[enter]
后while
执行?
有getchar
本身是while
要测试何时按下输入?
执行而如果我有以下几点:用getchar函数
while (getchar() != 'y')
printf("some...");
我想知道,如果while
测试字符只有当缓冲区为空。
所以,如果我输入
abcdy[enter]
那么[enter]
后while
执行?
有getchar
本身是while
要测试何时按下输入?
getchar()
块在系统级。
虽然getchar()
被封锁,只要按下几个按键,移动鼠标,切换窗口,有啤酒,...,...
getchar()
当你键入回车在正确的窗口将解除。然后你的程序会连续看到所有击键,直到并包括ENTER。
不,它将在任何*按键上解除阻止。你正在考虑'gets' –
我不使用'gets()'!它不是阻塞的'getchar()',它是阻塞(并缓冲字符)的操作系统。 – pmg
“试试看看”可以告诉你什么是事情,但不是它是什么应该要做。
在这种情况下,while
环路的行为是从代码明显的:它会继续直到getchar
返回值'y'
;当getchar返回'\n'
或EOF
或'y'
以外的任何内容时它不会停止。
对于getchar
自身的行为,从终端阅读,基本上有三种情况担心:
如果事情已经键入但尚未阅读,getchar
将返回一个字符。 getchar
本身并不在乎行界限; 输入导致它返回'\n'
。但是,终端(仿真器)只能以整行的形式向程序提供输入,具体取决于它所处的模式,因此,如果用户键入了abc
,但尚未输入,则输入您实际上可能处于状态3(如下)。
如果终端已经被关闭(或通过键入^d伪闭合)和所有输入到这一点已被读取,getchar
将返回EOF
,这不等于任何字符值。它会一遍又一遍地重复,直到应用程序停止调用它。您的代码是越野车因为它不检查EOF
:如果终端关闭,它将永久卡在循环中。 (由于正常运行程序,这可能并不明显,因为关闭一个终端会立即发送一个SIGHUP
信号,它将(默认情况下)终止进程。尝试运行它作为./a.out < /dev/null
以查看无限循环。)
如果所有输入的内容都已被读取,但终端仍处于打开状态,则在发生更多打字或终端关闭之前,getchar
将不会返回。底层的read
系统调用被称为块,这意味着内核将CPU从您的进程中分离出来,直到更多的输入变为可用(并让其他程序执行;它不是一个等待输入的旋转循环,正如人们可能想象的那样一个用于在DOS下的kbhit
/getch
)。
您是否尝试过运行该程序? – Ryan
@minitech,是的,它的工作原理。为什么? – xdevel2000