【问题标题】:Programming Data Types编程数据类型
【发布时间】:2012-07-25 04:29:12
【问题描述】:

我正在努力学习C,并想出了以下小程序。

#include "stdafx.h"

void main()
{
    double height = 0;
    double weight = 0;
    double bmi = 0;

    printf("Please enter your height in metres\n");
    scanf_s("%f", &height);
    printf("\nPlease enter your weight in kilograms\n");
    scanf_s("%f", &weight);
    bmi = weight/(height * height);
    printf("\nYour Body Mass Index stands at %f\n", bmi);
    printf("\n\n");
    printf("Thank you for using this small program.  Press any key to exit");
    getchar();
    getchar();
}

程序完美编译,但是程序返回的答案没有意义。如果我输入 1.8 的身高和 80 的体重,bmi 就像 1.#NF00 这没有意义。

我做错了什么?

【问题讨论】:

  • 双打不是%lf吗?无论如何,you shouldn't use void main.
  • @chris 很高兴知道。我总是被告知void main 是用于 C,而int main 是用于 C++。我想知道新 C/C++ 程序员这样做的习惯从何而来。
  • @Darthfett,我认为有几本书使用void main。我想这就是所有这些都被传递的地方。

标签: c types primitive-types


【解决方案1】:

scanfdouble 一起使用时,您必须使用%lf 说明符,因为不会使用scanf 提升指针。

有关更多信息,请阅读以下问题: Why does scanf() need "%lf" for doubles, when printf() is okay with just "%f"?

【讨论】:

    【解决方案2】:

    scanf(和scanf_s)格式%f需要指向float类型的指针。

    只需将 heightweight 变量的类型更改为 float 即可解决此问题。

    【讨论】:

    • 谢谢 :) 效果很好!我使用 %f 是因为我遵循的教程使用 %f 表示双精度。
    • @Matthew 我认为是时候学习新教程了。
    • 我猜是这样 :s 再次感谢 :)
    • @Matthew 请注意,对于打印,%fdouble 的正确格式说明符之一。 scanfprintf 的格式不同。
    • IMO,这种事情有足够的理由完全避免scanf() - 通过指针返回值是非常不可原谅的。将输入作为字符串并将其提供给atof()
    【解决方案3】:

    我认为 scanf_s 语法中的问题,您省略了第三个参数,即缓冲区大小(以字节为单位)。尝试以下操作:

    scanf_s("%lf", &valueToGet, sizeof(double));
    

    【讨论】:

    • 呃,他不是在这里扫描char,你知道
    • 是的,我知道这一点,我只是举例说明需要什么 3-rd 参数,这是我从 msdn 快速获取的,因为我试图快速响应答案我没有在给定任务上调整该示例,对不起))
    • 大概你说的是scanf_s,但你写的是scanf?格式说明符也是错误的。请修正错误或删除答案。
    • 干得好 - 取消投票 - 但请注意 8 应该是 sizeof(double)
    • sizeof valueToGet 会更健壮。
    【解决方案4】:

    scanf() 和 printf() 的缺点是它需要非常严格的格式,控制字符串和参数之间的任何不匹配都会导致严重的错误,从而使您的输入或输出完全没有意义。而这个错误往往是初学者犯的。

    【讨论】:

      【解决方案5】:

      如果您使用 %f 格式说明符,则必须使用浮点数据类型而不是双精度。

      【讨论】:

        【解决方案6】:

        问题是因为:

        format '%f' expects argument of type 'float*', but argument 2 has type 'double*' 
        

        有两种处理方法:

        1. 变量应该是float:

          double height = 0;    -->    float height = 0;
          double weight = 0;    -->    float weight = 0;
          double bmi = 0;       -->    float bmi = 0;
          
        2. 或者format specifier应该对应double

          scanf_s("%f", &height);   -->    scanf_s("%lf", &height);
          
          scanf_s("%f", &weight);   -->    scanf_s("%lf", &weight);
          
          printf("\nYour Body Mass Index stands at %f\n", bmi);
                                                    |
                                                    V 
          printf("\nYour Body Mass Index stands at %lf\n", bmi);
          

        【讨论】:

          猜你喜欢
          • 2010-10-23
          • 2013-07-20
          • 1970-01-01
          • 2017-11-24
          • 2017-04-27
          • 2011-07-01
          • 2011-03-03
          • 1970-01-01
          • 2011-01-30
          相关资源
          最近更新 更多