如果我有以下内容:
while (getchar() != 'y')
printf("some...");
我想知道while
仅在缓冲区为空时才测试字符。
所以,如果我输入
abcdy[enter]
然后[enter]
执行while
后?
按下输入后,getchar
本身是while
来测试吗?
答案 0 :(得分:2)
getchar是一个阻塞调用,即它会等到你给它输入。
答案 1 :(得分:1)
“尝试并看到”可以告诉你某些事情的作用,但不能告诉你应该做什么。
在这种情况下,while
循环的行为在代码中很明显:它会一直持续到getchar
返回值'y'
;当getchar返回'\n'
或EOF
或'y'
以外的任何内容时,它不会停止。
对于getchar
本身的行为,从终端读取,基本上有三种情况需要担心:
如果输入了某些内容但尚未阅读,getchar
将返回下一个字符。 getchar
本身并不关心线边界; ENTER 使其返回'\n'
。但是,终端(仿真器)可能只会根据它所处的模式向整个行提供输入,因此如果用户键入了abc
但尚未 ENTER ,您实际上可能在州3(下)。
如果终端已关闭(或通过键入 ^ D 进行伪关闭)并且已读取到该点的所有输入,getchar
将返回{{1 },这不等于任何字符值。它将一遍又一遍地执行此操作,直到应用程序停止调用它。您的代码错误,因为它不会检查EOF
:如果终端关闭,它将永远停留在循环中。 (这可能不正常,因为正常运行程序,因为关闭终端会导致立即发送EOF
信号,这将(默认情况下)终止进程。尝试将其作为SIGHUP
运行以查看无限循环。)
如果已读取所有已键入的内容,但终端仍处于打开状态,则在发生更多键入或终端关闭之前,./a.out < /dev/null
将不会返回。基础getchar
系统调用被称为块,这意味着内核将CPU从您的进程中取出,直到有更多输入可用(并允许其他程序执行;它不是自旋循环)等待输入,正如人们可能想象的那样,如果在DOS下习惯read
/ kbhit
。)
答案 2 :(得分:0)
getchar()
阻止系统级别。
当getchar()
被阻止时,您可以按键,移动鼠标,切换窗口,喝啤酒,......,....
getchar()
将取消阻止。然后你的程序会连续看到所有的击键,直到包括ENTER。