关于scanf与%c,%d的问题.请问为什么我前一段代码%d%d%c可以正常运行,而后一段代码会陷入死循环

关于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和你输入的是否一致