使用scanf不存储C double值

Unl*_*nda 3 c double

所以发生的事情是我要求用户输入,然后使用scanf将其存储到变量中.

但是当我尝试检索该值时,它只是0.000000.我确定我只是犯了一个愚蠢的noob错误,但是你能提供的任何帮助都表示赞赏.

printf("Enter the radius of your circle/sphere: ");
scanf("%f", &radius);

printf("\n%f", radius);
Run Code Online (Sandbox Code Playgroud)

例如:

输入圆/球的半径:10

0.0000000

谢谢你的时间!

use*_*342 5

正如@Chris McGrath所回答的那样,你必须使用%lf双精度格式说明符.但是,这并不能解释为什么%f格式可以正常工作printf.

%lf代表很久float,即double.当类型的值float传递给可变函数(那些接受可变数量的参数,例如printfscanf)时,它们被隐式提升为double:

float val;
printf("%f", val);   /* printf receives val cast to double, the same
                        as printf("%f", (double) val) */
printf("%lf", val);  /* printf also receives val cast to double, the
                        same as printf("%lf", (double) val) */
Run Code Online (Sandbox Code Playgroud)

由于两个printf("%lf", ...)printf("%f", ...)最后接收double,两者是完全等价的.

另一方面,所有参数scanf都是指针.scanf("%f", ...)期望收到一个float *,和scanf("%lf", ...)一个double *:

float floatval;
double dblval;
scanf("%f", &floatval); /* stores a float value to address received */
scanf("%lf", &dblval);  /* stores a double value to address received */
Run Code Online (Sandbox Code Playgroud)

这两个指针指向不同的类型,因此不能将其提升为另一个.如果他们接受了相同的处理scanf,它最终会将相同的值存储到为不同大小的类型分配的地址中,这不起作用.

这就是为什么在与值一起scanf使用%lf时严格要求使用说明符的原因double.