C中的getchar()在不按Enter键的情况下完成

C中的getchar()在不按Enter键的情况下完成,c,io,getchar,C,Io,Getchar,从我的示例中,我知道getchar()只在按Enter键时完成。让我们来考虑这个代码: #include<stdio.h> main() { getchar(); getchar(); getchar(); getchar(); getchar(); } #包括 main() { getchar(); getchar(); getchar(); getchar(); getchar(); } 我希望它能像这样运行:我先按一些键1,然后按回车键,然后按回车键

从我的示例中,我知道getchar()只在按Enter键时完成。让我们来考虑这个代码:

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


}
#包括
main()
{
getchar();
getchar();
getchar();
getchar();
getchar();
}
我希望它能像这样运行:我先按一些键1,然后按回车键,然后按回车键2,然后按回车键3,然后按回车键4,最后按回车键5+Enter,程序现在应该终止了。事实并非如此。发生的情况是:我按一些键1,然后按回车键,然后按回车键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);

} 
#包括
main()
{
int c=getchar();
int d=getchar();
int e=getchar();
printf(“剩下2个getchar\n”);
int f=getchar();
int g=getchar();
printf(“c是%d,d是%d,e是%d,f是%d,g是%d”,c,d,e,f,g);
} 
我输入:ABCDEFG然后输入。第2行getchar剩余部分应该在我按C或D时立即打印出来。但它最终被打印出来,这意味着所有getchar()都同时执行——这很奇怪

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

对于第一个问题,enter键是
getchar
可以处理并返回的字符。因此,如果键入两个字符并按enter键,则必须调用
getchar
三次以清除输入缓冲区。记住,
getchar
不是从键盘上取键,而是从输入缓冲区中取键。因此,如果在输入缓冲区中输入五个字符,例如abcdenter,则必须调用
getchar
五次才能获得所有这些字符,而第一个字符在按enter键之前不会返回

这也解释了你的第二个问题。一旦按下enter键,
getchar
调用将按顺序执行,而不是同时执行,但第一个调用直到此时才执行

你可能想了解一下

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

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

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

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

$ ./in < abcd_file 
$
在这种情况下,5个不带回车的字符使程序完成

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

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键之前,getchar()不可用。该密钥也会被返回。非缓冲输入通常在CRT中可用,但不是标准输入。这意味着当我在连续写入ABCD字符后按Enter键时,编译器实际上会启动程序。它为前四个getchar()提供前四个字符,如果第五个字符是enter本身,那么它将提供给最后一个getchar()。这个输入缓冲区是如何启动的?当编译器看到第一个getchar()时,是否启动输入缓冲区。在我按下Enter键之前,输入缓冲区一直在使用字符。输入缓冲区由操作系统/终端管理,而不是由编译器管理。编译器不启动程序,编译器编译程序。操作系统开始执行程序,然后getchar就变成了,我猜,一个阻塞系统调用,如果你想在google上搜索的话。如何暂时将终端切换出规范模式?
 #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 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.
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.