C程序新手小白求指导,为什么char输出会多出一个回车,然后赋值给第二个了?

#include
int main(void)
{
int a,b;
float x,y;
char ch1,ch2;
scanf("%d%d",&a,&b);
scanf("%f%f",&x,&y);
scanf("%c%c",&ch1,&ch2);
printf("a=%d,b=%d\n",a,b);
printf("x=%.1f,y=%.1f\n",x,y);
printf("ch1=%c,ch2=%c\n",ch1,ch2);

return 0;
}

然后
输出错误

错误输出:
a=1,b=3
x=1.5,y=3.0
ch1=
,ch2=C
期望输出:
a=1,b=3
x=1.5,y=3.0
ch1=C,ch2=D
为什么会这样?

你输入的C和D之间不能有任何分隔符

 1.对于scanf,其实是存在陷阱的。回车键或空格键、制表键本身也都算是一个字符。 当输入的变量的格式是char字符格式时,&c就会自动接收我们之前输入的回车键,则无法输入这个scanf语句的内容了。 
在这个程序中就体现为scanf("%c",&c);语句中的&c自动接收我们在输入变量b的值后按的那个回车。 因此在输入完float的两个值,我们按下回车,这个回车被读取,作为ch1的值,这个逗号为printf中的“,”。解决方法是:解决办法就是在scanf("%c",&c);语句中的双引号中%c前面加上空格或者tab键。同时在输入ch1和ch2时候,不要空格输入,需连续输入。如:CD


    int a,b;
    float x,y;
    char ch1,ch2;
    scanf("%d%d",&a,&b);
    scanf("%f%f",&x,&y);
    scanf(" %c %c",&ch1,&ch2);
    printf("a=%d,b=%d\n",a,b);
    printf("x=%.1f,y=%.1f\n",x,y);
    printf("ch1=%c,ch2=%c\n",ch1,ch2);
    system("pause");
    return 0;

scanf是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式会接收回车字符。这是个坑。第一种解决方式是可以拆开写成两个scanf,清空输入缓冲区在第一个scanf之后,执行fflush(stdin); 或者在后面的格式,scanf格式输入时要求输入格式与格式控制符中的完全一样(如:scanf("abcd%c",&ch);输入时必须输入abcde,ch得到的值为e)空格可以抵消前面输入的回车符。

#include
int main(void)
{
int a,b;
float x,y;
char ch1,ch2;
scanf("%d%d",&a,&b);
scanf("%f%f",&x,&y);
getchar();
scanf("%c%c",&ch1,&ch2);
printf("a=%d,b=%d\n",a,b);
printf("x=%.1f,y=%.1f\n",x,y);
printf("ch1=%c,ch2=%c\n",ch1,ch2);
return 0;
}
输入
1 3
1.5 3.0
CD
输出的就是那个正确结果