用getchar函数执行while

时间:2014-03-13 14:35:03

标签: c

如果我有以下内容:

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

我想知道while仅在缓冲区为空时才测试字符。

所以,如果我输入

abcdy[enter]

然后[enter]执行while后?

按下输入后,getchar本身是while来测试吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

“尝试并看到”可以告诉你某些事情的作用,但不能告诉你应该做什么

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

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

  1. 如果输入了某些内容但尚未阅读,getchar将返回下一个字符。 getchar本身并不关心线边界; ENTER 使其返回'\n'。但是,终端(仿真器)可能只会根据它所处的模式向整个行提供输入,因此如果用户键入了abc但尚未 ENTER ,您实际上可能在州3(下)。

  2. 如果终端已关闭(或通过键入 ^ D 进行伪关闭)并且已读取到该点的所有输入,getchar将返回{{1 },这不等于任何字符值。它将一遍又一遍地执行此操作,直到应用程序停止调用它。您的代码错误,因为它不会检查EOF:如果终端关闭,它将永远停留在循环中。 (这可能不正常,因为正常运行程序,因为关闭终端会导致立即发送EOF信号,这将(默认情况下)终止进程。尝试将其作为SIGHUP运行以查看无限循环。)

  3. 如果已读取所有已键入的内容,但终端仍处于打开状态,则在发生更多键入或终端关闭之前,./a.out < /dev/null将不会返回。基础getchar系统调用被称为,这意味着内核将CPU从您的进程中取出,直到有更多输入可用(并允许其他程序执行;它不是自旋循环)等待输入,正如人们可能想象的那样,如果在DOS下习惯read / kbhit。)

答案 2 :(得分:0)

getchar()阻止系统级别。

getchar()被阻止时,您可以按键,移动鼠标,切换窗口,喝啤酒,......,....

在正确的窗口中键入ENTER时,

getchar()将取消阻止。然后你的程序会连续看到所有的击键,直到包括ENTER。