【问题标题】:scanf not working. need to read double from consolescanf 不工作。需要从控制台读取双倍
【发布时间】:2012-04-09 06:39:04
【问题描述】:

我不确定我做错了什么,但我无法从控制台读取双精度。出于某种原因,阅读它可以正常工作。我正在使用 Xcode。

double n1;

// get input from the user
printf("Enter first number: ");
scanf("%f", &n1);

printf("%f", n1);

无论我输入什么,这总是会打印 0。

【问题讨论】:

标签: c io scanf


【解决方案1】:

%f 正在寻找浮点数,而不是双精度数。如果要使用双精度,请使用%lf 格式。

除了有点有趣之外,clang 会在没有任何额外标志的情况下对此发出警告,gcc 4.6 即使使用 -Wall -Wextra -pedantic 也不会发出警告。

【讨论】:

  • 幸运的是 GCC 5.2.1-22ubuntu2 抱怨没有任何参数
【解决方案2】:

%f 用于single precision floating-point value(浮点数)。您需要的格式说明符是%lf,意思是long precision floating-point value(双精度)。

【讨论】:

    【解决方案3】:

    这一切都与数据如何存储在内存中有关。
    先说一下内存中存储了多长时间和float。

    • 双精度(长浮点数,64 位)存储在内存中,如 this(小端符号)。
    • 浮点数(32 位)的存储方式类似于 this(小端符号)。
      也看看这个“en.wikipedia.org/wiki/Floating_point#Internal_representation”(所有浮动数据类型)

    所以在这里您要求将输入作为%f(即float,它是4 个字节,但double 是8 个字节),因此编译器从控制台获取输入并将其转换为float 类型并将其存储在内存位置(实际上是 8 个字节)的变量(这里是 n1)。

    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2012-03-19
    • 2010-12-28
    相关资源
    最近更新 更多