(C语言)输出的结果并非是我想要的,错误在哪里?

如下源代码所示,欲要c1获得字符A,c2获得字符B,a1为7.29,a2为101.29,但是我输入进去后得到的并非是我想要的结果,怎么回事?

#include<stdio.h>
int main()
{
    char c1,c2;
    double a1,a2;
    scanf("%lf%lf",&a1,&a2);
    getchar();
    scanf("%c %c",&c1,&c2);
    printf("a1=%lf,a2=%lf,c1=%c,c2=%c\n",a1,a2,c1,c2);
    return 0;
}

这样写。

1.第二个输出101.290001的原因是浮点数的运算是二进制的,存在不确定尾数。

2.如果你读入的是int,double等类型的就不会出现这个问题,它会跳过换行和空格直到出现对应的数据类型,而char类型,无论是换行符还是空格都算读入一个字符。

追问

还是不大明白。
①101.290001存在不确定尾数是怎么回事?
②也就是像这种不同类型的数据输入,中间需要用getchar();语句隔开?
③输入字符的那条语句中间有个空格,是为了隔开两个字符的输入吗?

追答

    比如0.1+0.2≠0.3:由于浮点数运算的时候,在计算机内部是二进制进行计算的,计算机中小数的二进制是一个无限由0和1组成的二进制,运算完后变成十进制会产生尾数,因此运算会接近0.3,在运用浮点数做运算比较的时候,就需要注意这一点。比如用户输入两个小数a,b,判断相加结果是否为0.3,那么应该用fabs(a1+a2)<=0.0000001来判断。这个学操作系统或计算机组成原理的时候都会讲。

2、3.我刚刚解释过了,如果后面输入的是char类型的,换行符和空格都会被读入,%c %c中间的空格不加那第二个c2就会读入空格,然后程序结束。如果你第二个代码读入int类型那么%d%d中间无论加不加空格效果都一样,因为它会跳过换行符和空格读入下一个数字。而%c不会,因为换行符和空行都会被%c读入。那个getchar()是读入101.29后面那个空格的,如果你输入完两个浮点数再回车换行再输入两个char字符,那么getchar()读入换行符。

温馨提示:答案为网友推荐,仅供参考
相似回答