getchar()有一个让人很头疼的特点,这也导致了很多人不喜欢用它……
它会向终端缓存要求一个字符,如果缓存里没有这个字符它就会等待用户输入,于是在用户没有任何多余的输入的情况下,每一次调用它都会等待用户输入一个字符,但是并不是用户输入一个字符它就停止等待了,它的等待是以回车确认作为等待的终止条件的,也就是说,用户可以在回车之前输入n个字符,但是它只会返回第一个字符,其它的所有字符都会保留在终端缓存中,当下一次再执行getchar()的时候,才会从终端缓存中取出并返回这个字符……
由于每一次输入一个字符的时候都要按回车确认以终止等待,所以在缓存中将会存留一个回车,如果不再执行一次取出这个回车,它可能会影响到下一次的输入……
但是往往这不是处理事情的最好方式,因为,用户可能并不是输入一个字符加一个回车,用户可能会输入更多字符和一个回车,这时,这种处理方式反而会得到一种反效果,因为用户可能希望将所有的字符放在一起输入,这时,下一次getchar将是第一次输入中的下一个字符而不再产生等待,而这种处理方式不仅不会去除掉最后的回车(因为此时的回车不再是下一个字符了,而是在整个字符串的最后),反而会使得字符串中下一个字符的输入丢失……
所以getchar的这个特点使得它在实际应用中大受限制,仅仅会在编程学习中发挥一定的作用……同时scanf也有类似的弊病,比如说在请求数字的时候输入字符串之后程序所有的请求数字的scanf将会得到一连串奇怪的返回值……
等等这些在处理复杂的输入时将会使人很头疼……
常用的办法是使用conio.h中的getch()编写自己想要的输入,这个函数只会等待一个字符,而不会等待回车……
一般模式下,输入getchar是以回车结束,有个输入缓冲区,会保存你输入的字符和回车符,那么如果你下次再用c = getchar();得到的不是你输入的字符,是回车符。再一次gechar就可以把上一次的回车符给去掉
程序中之所以要吸收回车,是因为回车也是一个字符,如果不吸收,如果下一个也是getchar,那么下一个字符就是回车了!有可能造成错误!
不过,对于你这个程序,第二个getchar()不吸收回车也可以。
但如果要输入两个字符:
#include "stdio.h"
void man()
{
char ch1,ch2;
printf("do you want to input date (Y/N)");
ch1=getchar();
ch2=getchar();
printf("%C",ch1);
printf("%C",ch2);
}
那么ch2 就是回车。而不是你想要的那个字符。
"跳过回车"的意思是,每次输入结束,都要输入回车以表示输入结束,然而这个回车也被捕捉在内
例如屏幕显示:
do you want to input date (Y/N)
你输入:y回车
这样即捕捉到了y,也捕捉到了回车
这个"跳过回车"的意思就是跳过这个回车
因为getchar()函数是捕捉输入的字符串,不会因为只输入一个字符而结束输入,所以在输入的时候,必须以回车表示输入结束.
getchar()会将输入的字符串放进缓冲区,下次调用的时候,会先从缓存取出数据,直到没有数据了,才会继续提示输入
所以例子的做法其实不严谨,如果输入:yes回车,那第2个getchar()将捕获到字母'e',而不是回车