problème convertion d'une chaine en double

problème convertion d'une chaine en double - C - Programmation

Marsh Posté le 21-06-2010 à 17:46:56    

Bonjour, donc pour être le plus clair possible voilà mon code:
 

Code :
  1. double lireDouble()
  2. {
  3.     char texte[100] = {0};
  4.     if(lire(texte, 100))
  5.     {
  6.         return strtod(texte, NULL);
  7.     }
  8.     else {return 0;}
  9. }


Code :
  1. int main()
  2. {
  3.     double poids = 0.0;
  4.     printf("\n\ncombien peses-tu? " );
  5.     poids = lireDouble();
  6.     printf("Tu peses %lf kilos\n\n", poids);
  7. }


 
J'ai bien sûr inclus mes bibliothèque, etc.
Mon soucis est que si j'entre un nombre tel que '12' j'obtiens '0.00000' et si j'entre un nombre tel que '12.23' là j'obtiens un nombre exorbitant  
 
Merci de votre aide

Reply

Marsh Posté le 21-06-2010 à 17:46:56   

Reply

Marsh Posté le 21-06-2010 à 18:00:06    

Il ne manquerait pas un include necessaire (stdlib.h ou stdio.h)?


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-06-2010 à 18:23:16    

Pour afficher un double avec printf() c'est %f. Pour saisir un double avec scanf, là c'est %lf. Ha, ha, les cotés obscurs du C. Dans le cas de printf, c'est à cause de la promotion implicite des float en double dans un appel type vararg. %lf doit certainement correspondre à un long double (en tous les cas pas sous Windows).

Reply

Marsh Posté le 21-06-2010 à 18:37:32    

Mes include's sont bien dedans, j'ai juste recopié le code.
et non même avec 'f' au lieu de 'lf' ça ne marche pas j'obtiens toujours un nombre exorbitant. :/
merci

Reply

Marsh Posté le 21-06-2010 à 19:27:23    

tpierron a écrit :

Pour afficher un double avec printf() c'est %f. Pour saisir un double avec scanf, là c'est %lf. Ha, ha, les cotés obscurs du C. Dans le cas de printf, c'est à cause de la promotion implicite des float en double dans un appel type vararg. %lf doit certainement correspondre à un long double (en tous les cas pas sous Windows).


 
%lf fonctionne aussi pour formater des doubles avec fprintf and co.  Pour les long double (fprintf et fscanf), c'est %Lf.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-06-2010 à 19:28:25    

jasinski13 a écrit :

Mes include's sont bien dedans, j'ai juste recopié le code.
et non même avec 'f' au lieu de 'lf' ça ne marche pas j'obtiens toujours un nombre exorbitant. :/
merci


 
Donne un code complet reproduisant le problème.  Ce que tu donnes fonctionne si je le complète comme il se doit.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-06-2010 à 19:52:39    

mon fichier: main.c

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "main.h"
  4. #define TAILLE_MAX 10
  5. int main()
  6. {
  7.     char chaine[TAILLE_MAX];//1. crée une chaine vide de 100 caractères
  8.     long age = 0;
  9.     double poids = 0;
  10.     printf("Comment vous vous appelez? " );//2. demande le nom
  11.     lire(chaine, TAILLE_MAX);//3. Appelle de la fonction lire
  12.     printf("Ha vous vous appellez %s!", chaine);//12. execution
  13.     printf("\n\nQuelle age as-tu? " );
  14.     age = lireLong();
  15.     printf("Vous avez %d ans\n\n", age);
  16.     printf("\n\ncombien peses-tu? " );
  17.     poids = lireDouble();
  18.     printf("Tu peses %f kilos\n\n", poids);
  19. }


 
mon fichier string.c:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "string.h"
  5. void viderBuffer()
  6. {
  7.     int c = 0;
  8.     while(c != '\n' && c != EOF)
  9.     {
  10.         c = getchar();
  11.     }
  12. }
  13. int lire(char* chaine, int taille)// 4. fonction lire
  14. {
  15.     char *positionEntree = NULL;// 5. initialisation d'un caractere(pointeur)
  16.     if(fgets(chaine, taille, stdin) != NULL)// 6. Si la saisie se faite sans erreur, c'est celui là qui demande le nom ;-)
  17.     {
  18.         positionEntree = strchr(chaine, '\n');// 7. le caractère prend la valeur de \n (retour à la ligne)
  19.         if(positionEntree != NULL)// 8. si on a trouvé le reotur à la ligne
  20.         {
  21.             *positionEntree = '\0';//9. on remplace ce caractère par \0
  22.         }
  23.         else
  24.         {
  25.             viderBuffer();
  26.         }
  27.         return 1;//10. renvoi 1 si vrai
  28.     }
  29.     else
  30.     {
  31.         viderBuffer();
  32.         return 0;//11. renvoi 0 si faux
  33.     }
  34. }
  35. long lireLong()
  36. {
  37.     char nombreTexte[100] = {0};
  38.     if(lire(nombreTexte, 100))
  39.     {
  40.         return strtol(nombreTexte, NULL, 10);
  41.     }
  42.     else{return 0;}
  43. }
  44. double lireDouble()
  45. {
  46.     char nombreTexte[100] = {0};
  47.     if (lire(nombreTexte, 100))
  48.     {
  49.         return strtod(nombreTexte, NULL);
  50.     }
  51.     else
  52.     {
  53.         return 0;
  54.     }
  55. }


 
mon fichier string.h

Code :
  1. int lire(char* chaine, int taille);
  2. void viderBuffer();
  3. long lireLong();
  4. double lireDouble();


 
Voilà mon code complet, bien séparés comme j'ai appris sur internet  
merci d'avance
 
 

Reply

Marsh Posté le 21-06-2010 à 20:03:18    

Je te conseille fortement de renommer ton fichier string.h en autre chose pour éviter la confusion avec la version standard.
 
Et le problème est que tu n'as pas de prototype pour lireDouble() dans main(), donc le code est généré comme s'il retournait un int et pas un double...  Inclus ta version (renommée!) de string.h dans main.c.
 
Et compile en activant un peu plus de warnings, les compilateurs devraient t'indiquer que tu fais usage de cette possibilité (ce qui est considéré de mauvais style depuis plus de 20 ans).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-06-2010 à 20:30:00    

Ok merci du conseil, voilà tout fonctionne comme voulu merci bien

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed