编程数据类型

7

我正在尝试学习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,这没有任何意义。

我做错了什么?


10
对于双精度浮点数,不应该是 %lf 吗?无论如何,你不应该使用 void main - chris
@chris 很好知道。我一直被教导说 void main 用于 C,而 int main 用于 C++。不知道新的 C/C++ 程序员这种习惯是从哪里来的。 - Casey Kuball
@Darthfett,我认为有一些书使用了void main。 我可以想象所有这些都是从那里传递下来的。 - chris
6个回答

11

10

scanf(以及scanf_s)的格式%f要求指向类型float的指针。

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


太好了!那个完美地起作用了!我使用了%f,因为我正在跟随的教程使用%f来表示double类型。 - Matthew
1
@Matthew 我认为现在是时候找一个新的教程了。 - Richard J. Ross III
@Matthew 注意,对于打印来说,%fdouble 的正确格式说明符之一。但是,scanfprintf 的格式有所不同。 - Daniel Fischer
2
在我看来,这种情况足以避免使用 scanf() - 通过指针返回值非常严格。把输入作为字符串并传递给 atof() - Russell Borogove

4
我认为scanf_s语法有问题,你忽略了第三个参数,这个参数是缓冲区的大小(以字节为单位)。请尝试以下代码:
scanf_s("%lf", &valueToGet, sizeof(double));

1
嗯,你知道他这里没有扫描一个 char - Richard J. Ross III
是的,我知道这个。我只是举了一个例子来展示需要第三个参数,我很快地从MSDN上找到了它,因为我试图快速回答问题,所以我没有根据给定的任务调整那个例子,对此我感到抱歉))。 - spin_eight
你可能是在谈论 scanf_s,但你写的是 scanf?而且格式说明符是错误的。请修正错误或删除答案。 - Paul R
2
干得好 - 取消了反对票 - 但请注意,8 应该真正是 sizeof(double) - Paul R
是的,我只是进来更正一下。为了使代码更具可移植性,而不是硬编码数字,最好使用像sizeof(type)这样的表达式。 - spin_eight
1
sizeof valueToGet 更加健壮。 - wildplasser

3

scanf()和printf()的缺点是它需要非常严格的格式,控制字符串和参数之间的任何不匹配都可能导致严重的错误,使你的输入或输出毫无意义。而这种错误通常是初学者犯的。


2

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


0
问题出在:
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. 或者格式说明符应该对应于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);
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接