所发生的情况是我请求用户输入,然后使用scanf将其存储到变量中。
但是当我尝试检索该值时,它只是0.000000。我确定我只是犯了愚蠢的错误,但是您能提供的任何帮助都将不胜感激。
printf("Enter the radius of your circle/sphere: ");
scanf("%f", &radius);
printf("\n%f", radius);
示例:
请输入你的圆/球体半径:10
0.0000000
感谢您的时间!
%lf
格式说明符来表示双精度类型。然而,这并不能解释为什么%f
格式说明符在printf
中也能正常工作。
%lf
代表长浮点型,即double
。当float
类型的值被传递给可变参数函数(接受可变数量参数的函数,如printf
和scanf
),它们会被隐式提升为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) */
既然 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 */
scanf
相同对待,那么最终会将相同的值存储到分配给不同大小类型的地址中,这是行不通的。double
值时,scanf
严格要求使用 %lf
指示符的原因。printf
中 %f
和 %lf
是相同的。这个答案更进一步解释了为什么它们在 scanf
中不同,因为 scanf
并不直接接收变长浮点数值,而是指向它们的指针。指针不会(也不能)遵循默认提升规则,所以 %lf
和 %f
必须执行不同的操作,以存储不同类型的值。 [另一个答案](https://dev59.com/hXVC5IYBdhLWcg3wsTbv#210591)表述了同样的观点,但没有解释原因。 - user4815162342scanf
需要指针,当然了!!!抱歉,我应该意识到这一点(或者更仔细地阅读你的答案)...谢谢,给了你十英镑 :) - barak manosprintf(“%lf”,...)
,尽管许多编译器将其作为扩展实现。 直到C99才正式添加。 C89指定%f
是float
和double
的格式说明符。 - M.M%lf
格式说明符:scanf("%lf", &radius);
%lf
(如果你的变量radius
是一个double
类型的话,因为你没有展示你的声明)? - AntonHscanf
的返回值。 - Ed Heal