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

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

#include main() { getchar(); getchar(); getchar(); getchar(); getchar(); } 

我预计它会像这样运行:我按下某个键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 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时,应该打印第2getchar 。但它最后打印,意味着所有getchar()s同时执行 – 这很奇怪。

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

按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

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

这也解释了你的第二个问题。 一旦命中输入getchar调用就会按顺序执行,而不是同时执行,但第一个调用直到那时才执行。

您可能想要阅读有关禁用输入缓冲的信息 。

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

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

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

  #include  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. 

输出:(在按下回车键之前给出输入)

 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. 

希望这可以帮助!