【问题标题】:C double value not stored using scanfC double 值未使用 scanf 存储
【发布时间】:2014-03-04 22:40:29
【问题描述】:

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

但是当我尝试检索该值时,它只是一个 0.000000。我确定我只是犯了一个愚蠢的菜鸟错误,但感谢您提供的任何帮助。

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

printf("\n%f", radius);

例如:

输入你的圆/球的半径:10

0.0000000

感谢您的宝贵时间!

【问题讨论】:

  • 您是否尝试过使用%lf(如果您的变量radius double,因为您没有显示您的声明)?
  • 还应该检查来自scanf的返回值
  • 如果我费心把这些放在答案中而不是 cmets 中,我会有更好的声誉:D
  • 你是如何声明半径的?
  • 谢谢!半径是双倍的。我不知道我应该使用 lf 双打。非常感谢您的帮助!

标签: c double


【解决方案1】:

正如@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) */

由于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的相同处理,最终会将相同的值存储到为不同大小的类型分配的地址中,这是行不通的。

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

【讨论】:

  • long float 不是double 的同义词,这是一个语法错误。浮点类型为floatdoublelong double
  • @KeithThompson 已更正,谢谢。顺便说一句,您在评论中犯了同样的错误。
  • 我没有了!
  • @user4815162342:我之前问过一个类似的问题并得到了相反的答案:stackoverflow.com/q/21443160/1382251...好吧,更准确地说,我问printf("%f",x)如何同时适用于@ 987654353@ 和double x。你能参考一下吗(如果不是太难的话)?谢谢。
  • @barakmanos 该问题的答案与我的答案的第一部分基本相同,我在其中解释了为什么%f%lfprintf 相同。这个答案更进一步解释了为什么scanf 两者相同,它不直接接收可变参数浮点值,而是指向浮点值的指针。指针不(也不能)属于默认提升规则,因此%lf%f 必须做不同的事情才能存储不同类型的值。 Another answer 声明相同,但没有解释原因。
【解决方案2】:

正如 AntonH 所说,如果 radius 被声明为 double,则必须使用 %lf 格式说明符:

scanf("%lf", &radius);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2015-02-23
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多