C中的getchar()完成而不按Enter键

use*_*782 3 c io getchar

从我之前的帖子中,我发现getchar()只有在按Enter键时才会完成.我们考虑一下这段代码:

#include<stdio.h>
main()
{
  getchar();
  getchar();
  getchar();
  getchar();
  getchar();


}
Run Code Online (Sandbox Code Playgroud)

我希望它能像这样运行:我按下某个键1,然后按Enter键,然后按键2键,然后按键3键,然后按键4键,然后按键4键,输入键,最后按键5键,输入,程序应立即终止.这不是实际发生的事情.会发生什么:我按下某个键1然后按Enter键,然后按键2键,输入键,然后按键3键,输入,程序最终终止!

  • 为什么最后两个getchar()不起作用?

我观察到的另一个奇怪的事情是,如果我这样做:key1,key2,key3,key4 + Enter然后程序终止.例如,如果我连续按q,w,e和r然后按Enter键,程序将终止.

  • 为什么不是所有的getchar()都要求输入?这是否意味着getchar()将任何其他键作为Enter?但接下来的密钥是否作为下一个getchar()的输入?

让我们考虑另一个代码:

#include<stdio.h>
main()
{

  int c=getchar();
  int d=getchar();
  int e=getchar();
  printf("2 getchar are remaining\n");
  int f=getchar();
  int g=getchar();
  printf(" c is %d, d is %d, e is %d, f is %d and g is %d",c,d,e,f,g);

} 
Run Code Online (Sandbox Code Playgroud)

我输入:ABCDEFG然后输入.当我按下C或D时,应该打印第2getchar.但它最后打印,意味着所有getchar()s同时执行 - 这很奇怪.

  • 程序是否逐行执行?即在第三个getchar之后,printf()应该可以工作.但是当所有的getchar()都被执行时它终于工作了.

hda*_*nte 5

按Enter键后,getchar()完成并不正确.只要有要读取的字符,getchar()就会完成.这种差异非常重要:例如,如果您将程序与重定向到文件的标准输入一起使用,请参阅:

$ hexdump -C abcd_file 
00000000  61 62 63 64 65                                    |abcde|
00000005

$ ./in < abcd_file 
$
Run Code Online (Sandbox Code Playgroud)

请注意,"abcd_file"是一个包含"abcde"的文件,没有换行符,您的程序完成后无需任何换行符.那是因为文件一直在提供字符而不是等待换行符.

另一方面,公共终端或终端仿真器具有称为"规范模式"的操作模式.规范模式意味着终端支持"命令行处理设施",并且在用户按下ENTER之前不会发出可用字符的信号.那是不正确的"getchar()等待ENTER"故事的来源.您可以将终端切换到规范模式,并查看它检索所有字符而无需按Enter键:

$ stty -icanon; ./in; stty icanon
ggggg$
Run Code Online (Sandbox Code Playgroud)

在这种情况下,没有输入的5个字符使程序完成.

最后,getchar()看起来像早期返回的原因是因为它也返回ENTER字符.所以"a \nb \nc \n"是6个字符,前5个由getchar()返回,第6个在程序完成后从终端队列中删除.键入"abcd \n"还意味着getchar()将立即可用于连续5次读取,因为终端队列中存储了5个字符.

http://www.gnu.org/software/libc/manual/html_node/Noncanonical-Input.html#Noncanonical-Input