最近在做图形学上机,遇到许多问题,其中关于double型数的输入因为一个简单的错误,却困惑了很久。在书中看到用printf()函数输出时,用格式%f可以输出实数,包括单精度,双精度数,隐含输出6位小数。所以误以为对scanf()也是一样的,所以程序中输入用了如下的语句:
double Scal_R;
scanf("%f", &Scal_R);
程序里用输入的这个参数Scal_R控制一个圆的半径比例,比如输入此参数为1.5时,应该将原来圆的半径乘以1.5再重画此圆。但总是没有出现正确结果,也一直没有往这个地方想,郁闷了好一阵子。后来还是看了下谭老的书,才发现原来scanf()的附加格式说明字符里有个"l",用于输入长整型数据(可用%ld,%lo,%lx) 以及double型数据(用%lf或%le) ,可见输入double型数应该用"%lf",于是做了如下试验:
#include <stdio.h>
int main()
{
double d_ouble;
scanf("%f", &d_ouble);
printf("%f\n", d_ouble);
return 0;
}
运行结果(VC):
=======================================================================
1.5↙
-92559604329505835000000000000000000000000000000000000000000000.000000
=======================================================================
显然没有正确输出, 改为%lf 后:
#include <stdio.h>
int main()
{
double d_ouble;
scanf("%lf", &d_ouble);
printf("%f\n", d_ouble);
return 0;
}
运行结果:
=======================
1.5↙
1.500000
=======================
OK了,此时的输出也是正确的,%f 可以输出双精度数。当然用%lf 输出也可得到正确结果。
★ 其实在前面的日志中记过这个附加格式说明符([017]scanf格式控制符的完整格式), 只是当时没理解它是用来做什么的, 也没有注意。在此补充:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字符 说明
——————————————————————————————————————
l 用于输入长整型数据(可用%ld,%lo,%lx)以及double型数据(用%lf或%le)
——————————————————————————————————————
h 用于输入短整型数据(可用%hd, %ho, %hx)
——————————————————————————————————————
域宽 指定输入数据所占宽度(列数),域宽应为正整数
——————————————————————————————————————
* 表示本输入项在读入后不赋绐相应的变量
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
评论