2012-07-26 78 views
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'。](http://stroustrup.com/bs_faq2.html#void-main) – chris 2012-07-26 14:42:25

+0

@chris好東西知道。我總是被教導,'void main'是用於C,'int main'用於C++。我想知道新C/C++程序員做這件事的習慣是從哪裏來的。 – Darthfett 2012-07-26 18:53:35

+0

@Darthfett,我認爲有幾本書使用'void main'。我想這就是所有這些都是從那裏傳來的。 – chris 2012-07-26 18:58:25

回答

10

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

只需將您的heightweight變量的類型更改爲float即可解決此問題。

+0

謝謝:)完美的工作!我使用了%f,因爲我在下面的教程中使用了%f作爲double。 – Matthew 2012-07-26 14:45:48

+1

@Matthew我認爲現在是時候獲得一個新的教程。 – 2012-07-26 14:47:22

+0

我想是這樣的:再次感謝:) – Matthew 2012-07-26 15:14:21

4

我覺得在scanf_s大成問題,你中省略3擋的說法,這是在字節緩衝區的大小。請嘗試以下操作:

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

嗯,他沒有在這裏掃描'char',你知道 – 2012-07-26 14:46:47

+0

是的,我知道這個我只是一個例子來顯示需要什麼3-rd參數,這是我從msdn快速獲取的,因爲我試圖快速回答我沒有根據給定的任務調整這個例子,對不起)) – 2012-07-26 14:49:35

+0

大概你在談論'scanf_s',但你寫了'scanf'?格式說明符也是錯誤的。請修正錯誤或刪除答案。 – 2012-07-26 14:51:26

3

的scanf()函數和printf(的缺點)是它需要非常嚴格的格式,控制線和參數之間的任何不匹配可能會導致劇烈的錯誤,讓您的輸入或輸出不作任何一點意義。這個錯誤通常是由初學者做出的。

2

如果您使用%f格式說明符,則必須使用float數據類型而不是double。

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);