为什么第二个scanf()没有执行,请高手解决

时间:2021-11-10 11:24:27
#include<stdio.h>
main(){ 
int date=0,da=0,xiao=0; 
char c ;
scanf("%c",&c);
if(c>='a'&&c<='z')
    {
        xiao++;
        printf("%d\n",sizeof(c)) ;
        scanf("%c",&c);

    }
printf("xiao=%d,da=%d,date=%d\n",xiao,da,date);
getch();
}
为什么第二个scanf()没有执行,请高手解决 

7 个解决方案

#1


printf("%d\n",sizeof(c)) ;
fflush(stdin);
scanf("%c",&c); 

#2


把你的回车读进去了~~~

#3


或者
scanf("%c",&c); 
fflush(stdin);
if(c>='a'&&c <='z') 

每次scanf之后清理也是个好习惯。

#4


偶一般都是每次SCFANF前清理~

#5


这是键盘缓冲区的问题。

例如,你遇到第一个scanf的时候,你在键盘上实现了两个操作,一个是输入A  一个是敲回车键(\n),将A送入c的内存单元。

c是char型,只能存放一个字符,所以输入A时,A赋值进了c内存单元,而此时的(\n)驻留在了键盘缓冲区中。

待遇到了第二个scanf的时候,程序会将键盘缓冲区中的(\n)赋值给第二个scanf()中的c变量。由于第二个scanf中的c变量取到了值(即 \n),即完成了

第二个scanf(此时c中保存的值为 \n  )。由于此时c中的值( 为 \n)满足if()的结束条件,所以直接导致程序运行结束。

你可以在程序中加入一个清除内存缓冲区的函数flushall(),即可解决这个问题。


#include <stdio.h>
#include <stdlib.h>
main()
{
  int date=0,da=0,xiao=0;
char c ; 
scanf("%c",&c);
if(c>='a'&&c <='z')

        xiao++;
        printf("%d\n",sizeof(c)) ;
flushall();
        scanf("%c",&c);

    } 
printf("xiao=%d,da=%d,date=%d\n",xiao,da,date);
getch();
}



#6


由于第一个scanf输入完后的回车留在了缓冲区,导致第二个scanf直接提取回车而不等待键盘输入了;
像楼上的使用fflush(stdin)函数清除缓冲区,就能使第二个scanf等待键盘输入,
顺便说下stdin是指向终端输入的指针。
如果第二个输入的不是字符型数据,那就没必要使用fflush(stdin)函数了;
另外,除了使用fflush(stdin)函数外,还有个方法也可以的,就是把第二个scanf语句改为scanf("\n%c",&c),
说明下:“\n"的作用就是提取了第一个scanf留在缓冲区的回车; 

#7


楼上正解。

#1


printf("%d\n",sizeof(c)) ;
fflush(stdin);
scanf("%c",&c); 

#2


把你的回车读进去了~~~

#3


或者
scanf("%c",&c); 
fflush(stdin);
if(c>='a'&&c <='z') 

每次scanf之后清理也是个好习惯。

#4


偶一般都是每次SCFANF前清理~

#5


这是键盘缓冲区的问题。

例如,你遇到第一个scanf的时候,你在键盘上实现了两个操作,一个是输入A  一个是敲回车键(\n),将A送入c的内存单元。

c是char型,只能存放一个字符,所以输入A时,A赋值进了c内存单元,而此时的(\n)驻留在了键盘缓冲区中。

待遇到了第二个scanf的时候,程序会将键盘缓冲区中的(\n)赋值给第二个scanf()中的c变量。由于第二个scanf中的c变量取到了值(即 \n),即完成了

第二个scanf(此时c中保存的值为 \n  )。由于此时c中的值( 为 \n)满足if()的结束条件,所以直接导致程序运行结束。

你可以在程序中加入一个清除内存缓冲区的函数flushall(),即可解决这个问题。


#include <stdio.h>
#include <stdlib.h>
main()
{
  int date=0,da=0,xiao=0;
char c ; 
scanf("%c",&c);
if(c>='a'&&c <='z')

        xiao++;
        printf("%d\n",sizeof(c)) ;
flushall();
        scanf("%c",&c);

    } 
printf("xiao=%d,da=%d,date=%d\n",xiao,da,date);
getch();
}



#6


由于第一个scanf输入完后的回车留在了缓冲区,导致第二个scanf直接提取回车而不等待键盘输入了;
像楼上的使用fflush(stdin)函数清除缓冲区,就能使第二个scanf等待键盘输入,
顺便说下stdin是指向终端输入的指针。
如果第二个输入的不是字符型数据,那就没必要使用fflush(stdin)函数了;
另外,除了使用fflush(stdin)函数外,还有个方法也可以的,就是把第二个scanf语句改为scanf("\n%c",&c),
说明下:“\n"的作用就是提取了第一个scanf留在缓冲区的回车; 

#7


楼上正解。