从我以前的帖子中,我了解到getchar()只有在我们按Enter键时才会完成。让我们考虑这个代码:
#include<stdio.h>
main()
{
getchar();
getchar();
getchar();
getchar();
getchar();
}
我希望它是这样运行的:我按下某个键1,然后按Enter,然后按下键2,然后按Enter,然后按下键3,然后按下键4,最后按下键5,程序现在应该终止了。这不是实际发生的情况。事情是这样的:我按下某个键1,然后按Enter,然后按下键2,然后按下键3,然后按下Enter,程序最终终止!
我观察到的另一个奇怪的事情是,如果我这样做:key 1、key 2、key 3、key 4回车,程序就会终止。例如。如果我连续按q、w、e和r,然后回车,程序就会终止。
让我们考虑另一个代码:
#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()都同时执行——这很奇怪。
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值。不能告诉你更多,因为这个值因系统而异。