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);
fflush(stdin);
scanf("%c",&c);
#2
把你的回车读进去了~~~
#3
或者
scanf("%c",&c);
fflush(stdin);
if(c>='a'&&c <='z')
每次scanf之后清理也是个好习惯。
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(),即可解决这个问题。
例如,你遇到第一个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留在缓冲区的回车;
像楼上的使用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);
fflush(stdin);
scanf("%c",&c);
#2
把你的回车读进去了~~~
#3
或者
scanf("%c",&c);
fflush(stdin);
if(c>='a'&&c <='z')
每次scanf之后清理也是个好习惯。
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(),即可解决这个问题。
例如,你遇到第一个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留在缓冲区的回车;
像楼上的使用fflush(stdin)函数清除缓冲区,就能使第二个scanf等待键盘输入,
顺便说下stdin是指向终端输入的指针。
如果第二个输入的不是字符型数据,那就没必要使用fflush(stdin)函数了;
另外,除了使用fflush(stdin)函数外,还有个方法也可以的,就是把第二个scanf语句改为scanf("\n%c",&c),
说明下:“\n"的作用就是提取了第一个scanf留在缓冲区的回车;
#7
楼上正解。