提问者:小点点

C 中的 getchar() 无需按回车键即可完成


从我以前的帖子中,我了解到getchar()只有在我们按Enter键时才会完成。让我们考虑这个代码:

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


}

我希望它是这样运行的:我按下某个键1,然后按Enter,然后按下键2,然后按Enter,然后按下键3,然后按下键4,最后按下键5,程序现在应该终止了。这不是实际发生的情况。事情是这样的:我按下某个键1,然后按Enter,然后按下键2,然后按下键3,然后按下Enter,程序最终终止!

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

我观察到的另一个奇怪的事情是,如果我这样做:key 1、key 2、key 3、key 4回车,程序就会终止。例如。如果我连续按q、w、e和r,然后回车,程序就会终止。

  • 为什么不是所有的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);

} 

我输入:EFG EFG,然后输入。当我按C或D时,应该立即打印剩余的第2行getchar()。但它最后打印出来,这意味着所有getchar()都同时执行——这很奇怪。

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

共3个答案

匿名用户

getchar()在您按回车键后完成是不正确的。只要有要读取的字符,getchar()就会完成。这种区别很重要:例如,如果您使用将标准输入重定向到文件的程序:

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

$ ./in < abcd_file 
$

请注意,“abcd_file”是一个包含“abcde”的文件,没有换行符,您的程序在任何地方都不需要换行符就完成了。这是因为该文件一直在提供字符,而不是等待换行符。

另一方面,普通终端或终端仿真器具有一种称为“规范模式”的操作模式。标准模式意味着终端支持“命令行处理设施”,并且在用户按下ENTER键之前不会发出可用字符的信号。这就是错误的“getchar()等待回车”故事的来源。您可以将终端从规范模式切换到检索所有字符,而无需按enter:

$ stty -icanon; ./in; stty icanon
ggggg$

在这种情况下,没有输入的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

匿名用户

对于第一个问题,回车键是getchar可以处理并返回的字符。因此,如果键入两个字符并按enter键,则必须调用getchar三次以清除输入缓冲区。记住,getchar不从键盘获取键,而是从输入缓冲区获取键。因此,如果您将五个字符推入输入缓冲区,例如abcd<kbd>enter</kbd>,则必须调用<code>getchar</code>五次才能获得所有这些字符,而第一个字符将不会返回,直到您按下<kbd<enter</kbd>。

这也解释了你的第二个问题。按下< kbd>enter键后,< code>getchar调用将按顺序执行,而不是同时执行,但第一个调用在此之前不会执行。

您可能想了解有关禁用输入缓冲的信息。

匿名用户

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

它是逐行执行的,但是ENTER键是getchar()的有效输入,因此它将读取其ASCII值。不能告诉你更多,因为这个值因系统而异。