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

时间:2014-12-06 20:44:10

标签: c io getchar

从我的previous post开始,我才知道getchar()仅在按Enter键时才会完成。我们来考虑一下这段代码:

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


}

我预计它会像这样运行:我按下某个键1然后按Enter键,然后按键2键,然后按键3键,然后按键4键,然后按键4键,输入键,最后按键键5 +回车键,程序应立即终止。这不是实际发生的事情。会发生什么:我按下某个键1然后按Enter键,然后按键2按Enter键,然后按键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);

} 

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

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

4 个答案:

答案 0 :(得分:5)

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

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

$ ./in < abcd_file 
$

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

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

答案 1 :(得分:2)

对于您的第一个问题,回车键是getchar可以处理和返回的字符。因此,如果您键入两个字符并按Enter键,则必须调用getchar三次以清除输入缓冲区。请记住,getchar不会从键盘输入密钥,而是从输入缓冲区获取密钥。因此,如果您将五个字符输入输入缓冲区,例如abcd 输入,你必须拨打getchar五次以获得所有这些,并且第一个不会回来,直到你点击 enter

这也解释了你的第二个问题。一旦输入被命中,getchar调用将按顺序执行,而不是同时执行,但第一个调用在此之前不会执行。

您可能想了解disabling input buffering

答案 2 :(得分:1)

  

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

它是逐行执行的,但是ENTER键是getchar()的有效输入,因此它将读取其ASCII值。无法告诉您更多信息,因为此值会因系统而异。

答案 3 :(得分:0)

getchar()按字符获取每个输入字符。它不会等待按下回车键。运行下面给出的程序并检查输出以获得更好的图像。

 #include <stdio.h>
    int main( ) {

       int c;
       int i;
       printf( "Enter a value :");
       i = getchar();
       printf( "Enter a value :");
       c = getchar();
       printf( "\nYou entered: ");
       putchar( c );
       printf( "\nYou entered: ");
       putchar(i);
       return 0;
    }

输出:(输入一个字符后按Enter键)

Enter a value :1
Enter a value :
You entered:

You entered: 1
Process returned 0 (0x0)   execution time : 3.183 s
Press any key to continue.

OUTPUT:(在按下回车键之前输入INPUTS)

Enter a value :12
Enter a value :
You entered: 2
You entered: 1
Process returned 0 (0x0)   execution time : 5.389 s
Press any key to continue.

希望这有帮助!