黑马程序员技术交流社区

标题: scanf 缓冲区 [打印本页]

作者: ai77033024    时间: 2015-8-31 21:52
标题: scanf 缓冲区
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()做输入操作时,首先会检查输入缓冲区是否为空,不为空,则从缓冲区中读取数据。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2