2017-08-13 1 views
1

Je pratique la programmation c maintenant et j'ai fait une calculatrice d'IMC. Cela fonctionne très bien, mais lorsque l'utilisateur saisit une chaîne ou un caractère sur le premier scanf qui envoie des données pour faire flotter la variable «poids». Il a passé tout scanf après cela et m'a montré une erreur que Your BMI is 1.#J. Comment résoudre cette erreur? Voici mon code.Obtenir l'erreur quand l'utilisateur a entré une chaîne dans un scanf qui maintient la variable float

#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

pourquoi entrer ombles ou chaîne quand quelqu'un demande poids et que dans float [format specifier] (https://www.le.ac.uk/users/rjm1/cotter/page_30.htm) – wrangler

Répondre

4

scanf retourne le nombre de valeurs lues, donc devrait être l'un dans votre exemple, que vous lisez en une seule valeur flottante.

Vous pouvez vérifier que scanf retourne cette valeur et si elle ne fait pas une sorte de récupération telles que la lecture jusqu'à la fin de la ligne:

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

Ceci est la bonne approche, même si elle serait mieux si la boucle while romp avec une condition d'erreur retenue dans le cas d'atteindre EOF plutôt que d'une nouvelle ligne. Peu importe, uptick-digne. – WhozCraig

0

Pour passer à l'argument suivant ajouter une fflush (stdin) après la scanf:

scanf("%f",&weight); 

    fflush(stdin); 

et vous devez controlez votre entrée comme ceci:

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

* "ajouter un fflush (stdin) ..." * - ou * ne pas *. Le comportement pour cela n'est * pas * défini par la norme de langage ou sa bibliothèque. 'fflush' ne devrait être invoqué que sur les flux * output *, ou sur les flux d'entrée/sortie où les dernières opérations étaient des * output *. – WhozCraig

+0

vrai, mais avec lui, il peut passer au prochain "scanf" et c'est ce qu'il veut je suppose. –

+1

Voir [Utiliser 'fflush (stdin)'] (http://stackoverflow.com/questions/2979209/using-fflushstdin) pour les nuances, mais faites attention à ne pas l'utiliser - et ne l'utilisez pas sur la plate-forme Windows. –