2017-08-13 8 views
1

私は現在Cプログラミングを練習しており、BMI計算機をいくつか作っています。それは素晴らしいが、最初のscanfのユーザー入力文字列または文字がデータをfloat変数 'weight'に送信するときに機能します。それ以来、それはすべてscanfを通過し、私にはエラーYour BMI is 1.#Jを示した。このエラーを解決するには?ここに私のコードです。あなたは、単一のfloat値に読んでいるよう浮動小数点変数を保持する文字列をscanfに入力したときにエラーが発生する

#include <stdio.h> 

int main() 
{ 
    float weight; 
    float height; 
    float result; 
    float c_height; 

    printf("Enter your weight as kilogram...\n\n> "); 
    scanf("%f",&weight); 
    //If user input char or string , it passed all thing and showed error. 

    printf("\nEnter your height as centimetres...\n\n> "); 
    scanf("%f",&height); 

    c_height=(height/100)*(height/100); 
    result=weight/c_height; 

    if(result<18.50) 
    { 
    printf("\nYour BMI is %.2f\n\n",result); 
    printf("You are underweight! Try to eat more frequently\n\n"); 
    printf("Thank you for using my program!\n\n"); 

}else if(result>=18.50 && result<22.90) 
{ 
    printf("\nYour BMI is %.2f\n\n",result); 
    printf("You are healthy! Keep eating healthy\n\n"); 
    printf("Thank you for using my program!\n\n"); 

}else if(result>=22.90 && result<24.90) 
{ 
    printf("\nYour BMI is %.2f\n\n",result); 
    printf("You are a little overweight! Avoid eating some fat and an oil\n\n"); 
    printf("Thank you for using my program!\n\n"); 

}else if(result>=24.90 && result<29.90) 
{ 
    printf("\nYour BMI is %.2f\n\n",result); 
    printf("You are overweight! Avoid eating fat and do exercise often\n\n"); 
    printf("Thank you for using my program!\n\n"); 

}else if(result>=29.90) 
{ 
    printf("\nYour BMI is %.2f\n\n",result); 
    printf("You are obese! Do exercise everyday and eat carefully!\n\n"); 
    printf("Thank you for using my program!\n\n"); 

}else 
{ 
    printf("Error occured!!"); 
} 
return 0; 

}

+0

scanfの後誰かが重量を求めているときに文字列や浮動小数点数[フォーマット指定子](https://www.le.ac.uk/users/rjm1/cotter/page_30.htm) – wrangler

答えて

4

scanf関数は、値の数が読み込ま戻りますので、あなたの例では1でなければなりません。あなたはそのscanf関数をチェックすることができ

は、その値を返し、それは、そのようなラインの最後まで読みとして回復のいくつかの種類をしない場合:

while(scanf("%f",&height) != 1) 
{ 
    int c; 
    while((c = getchar()) != '\n' && c != EOF) 
    ; 
    printf("Enter your weight as kilogram...\n\n> "); 
} 
+1

これは正しいアプローチですが、 whileループが、改行ではなくEOFに達した場合にエラー状態が保持されて破損した場合は、より良いでしょう。それにかかわらず、アップティックにふさわしい。 – WhozCraig

0

はfflushはを追加し、次の引数に渡す(STDIN)

scanf("%f",&weight); 

    fflush(stdin); 

、あなたはこのようなあなたの入力をcontroleする必要があります:文字を入力するために、なぜ

if (scanf("%lf", &weight) == 1) 
    printf("It's float: %f\n", weight); 
else 
    printf("It's NOT float ... \n"); 
+1

* "fflush(stdin)を追加..." * - または* *しない*。その動作は、言語標準またはそのライブラリによって定義されていません。 'fflush'は* output *ストリーム、または最後の操作が*出力*だった入出力ストリームでのみ呼び出されるべきです。 – WhozCraig

+0

本当ですが、彼と一緒に次の "scanf"に渡すことができます。 –

+1

ニュアンスについては[fflush(stdin) '](http://stackoverflow.com/questions/2979209/using-fflushstdin)を参照してください。しかし、それを使用することには慎重であり、Windowsプラットフォーム以外では使用しないでください。 –

関連する問題