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 这没有意义。

我究竟做错了什么?

4

6 回答 6

11

scanf与 a 一起使用时double,您必须使用说明%lf符,因为指针不与 一起提升scanf

有关更多信息,请阅读以下问题: 当 printf() 只使用“%f”时,为什么 scanf() 需要“%lf”进行双打?

于 2012-07-26T14:44:21.930 回答
10

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

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

于 2012-07-26T14:43:17.550 回答
4

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

scanf_s("%lf", &valueToGet, sizeof(double));
于 2012-07-26T14:45:45.633 回答
3

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

于 2012-07-27T11:56:42.960 回答
2

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

于 2014-01-13T20:37:11.077 回答
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. 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);
    
于 2015-06-01T05:24:21.127 回答