C语言中的输入函数(包括scanf,getchar等)在接收键盘输入时,把输入放在了“输入缓冲区”。当scanf()、getchar()做输入操作时,以回车符作为结束标志,并把回车符' /n '包含在输入字符串中储存在缓冲区,再从输入缓冲区中取走输入字符串赋值给变量,但却没有取走回车符'/n'。再当我们二次调用scanf()时,scanf()函数被跳过,”得不到执行“。因为这时输入缓冲区依然保留了前次输入的时候留下的回车符'/n',故直接跳过。注:当输入为字符时,缓冲区中遗留下了'/n',当输入为int 时,则不发生该情况。
解决办法:
C语言中有一个清除缓冲区的函数int fflush(FILE*),即 fflush(stdin) 该函数在<stdio.h>中定义。具体到本程序,需要清除的缓冲区是键盘缓冲区stdin。需要在scanf调用后面彻底清空缓冲区。
例:
#include <windows.h>
int main( )
{
char a[100]="";
char b = 'q';
scanf("%s", a); //需要在输入后手动清空缓冲区,加入fflush(stdin) 即可避免。
b = getchar();
printf("a = %s , b= %c/n",a,b);
return 0;
}
例:
#include <windows.h>
int main( )
{
char i;
do
{
scanf("%c",&i);
printf("i= %c ,/n",i);
}while(1);
return 0;
}
我们定义了一个字符变量i,当我们输入abcd 时,则每次scanf都会从输入缓冲区中读出一个字符给i,则输出结果为:
abcd
i= a ,
i= b ,
i= c ,
i= d ,
i=
,
----- 此处接着输入,上面有两个'/n'。
得出,scanf()做输入操作时,首先会检查输入缓冲区是否为空,不为空,则从缓冲区中读取数据。 |
|