连续的printf和scanf,scanf被跳过。首先只会跳过字符型%c不会跳过数值的输入。
先拿出例子,如下代码:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a,b,j;
char z;
printf("请输入两个数\n");
scanf("%d%d",&a,&b);
printf("请输入运算符\n");
scanf("%c",&z);
switch(z)
{
case '+':printf("%d",(a+b));
break;
case '-':printf("%d",(a-b));
break;
case '*':printf("%d",(a*b));
break;
case '/':printf("%d",(a/b));
break;
}
system("pause");
运行结果:
发现运行结果跳过了第二个scanf(“%c”),但是第一个scanf(%d)并未被跳过,并且scanf被跳过后续需要该字符的代码自然也无用了。
解决方法:法一. 在scanf()中的%c前加上一个\n或者直接输入一个空格。
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a,b,j;
char z;
printf("请输入两个数\n");
scanf("%d%d",&a,&b);
printf("请输入运算符\n");
scanf("\n%c",&z);
switch(z)
{
case '+':printf("%d",(a+b));
break;
case '-':printf("%d",(a-b));
break;
case '*':printf("%d",(a*b));
break;
case '/':printf("%d",(a/b));
break;
}
system("pause");
}
结果:
j
法二. 在printf()和scanf()之间加一个getchar()。
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a,b,j;
char z;
printf("请输入两个数\n");
scanf("%d%d",&a,&b);
printf("请输入运算符\n");
getchar();
scanf("%c",&z);
switch(z)
{
case '+':printf("%d",(a+b));
break;
case '-':printf("%d",(a-b));
break;
case '*':printf("%d",(a*b));
break;
case '/':printf("%d",(a/b));
break;
}
system("pause");
}
结果:
原因:上述情况是因为输入数据后需要回车键才能将数据送入缓冲区,但是在该过程中回车键(换行符)刚好被下一个scanf()所捕获,所以解决方法就是选择方法来抵消这个回车键(换行符)。而第一个scanf()之所以没有该情况是因为第一个scanf为%d数据类型的输入函数,无法捕获回车键(换行符)等字符型。