关于scanf与%c,%d的问题
请问为什么我前一段代码%d %d %c可以正常运行,而后一段代码会陷入死循环?
正确代码
#include
int main()
{
int m,n;
char ch;
while(1)
{
scanf("%d %d %c",&m,&n,&ch);//注意点!!
if(m==0 && n==0)
break;
else
switch(ch)
{
case '+':
printf("%d\n",m+n);
break;
case '-':
printf("%d\n",m-n);
break;
case '*':
printf("%d\n",m*n);
break;
case '/':
if(n!=0)
{printf("%d\n",m/n);
break;}
else
printf("Error\n");
break;
case '%' :
printf("%d\n", m%n);
break;
default:
printf("Error\n");
break;
}
}
}
错误代码:
#include
int main()
{
int m,n;
char ch;
while(1)
{
scanf("%d%d%c",&m,&n,&ch);//错误点!!!
if(m==0 && n==0)
break;
else
switch(ch)
{
case '+':
printf("%d\n",m+n);
break;
case '-':
printf("%d\n",m-n);
break;
case '*':
printf("%d\n",m*n);
break;
case '/':
if(n!=0)
{printf("%d\n",m/n);
break;}
else
printf("Error\n");
break;
case '%' :
printf("%d\n", m%n);
break;
default:
printf("Error\n");
break;
}
}
}
参考GPT和自己的思路:
这个问题主要是因为%c会读取缓冲区中的回车符(\n),而%d不会读取,所以第二个scanf函数会读取到一个回车符,导致第三个scanf函数无法读取正确的字符,从而陷入死循环。
正确的做法是在读取%c之前再加一个空格,即:scanf("%d%d %c",&m,&n,&ch); 这样可以消耗掉缓冲区中的回车符,从而避免这个问题。
你的输入是连续的,还是有空格
下断点看看 m n ch和你输入的是否一致