Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1045 connectés 

  FORUM HardWare.fr
  Programmation
  C

  problème convertion d'une chaine en double

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème convertion d'une chaine en double

n°2003450
jasinski13
Posté le 21-06-2010 à 17:46:56  profilanswer
 

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

mood
Publicité
Posté le 21-06-2010 à 17:46:56  profilanswer
 

n°2003457
Un Program​meur
Posté le 21-06-2010 à 18:00:06  profilanswer
 

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


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2003465
tpierron
Posté le 21-06-2010 à 18:23:16  profilanswer
 

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

n°2003478
jasinski13
Posté le 21-06-2010 à 18:37:32  profilanswer
 

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

n°2003489
Un Program​meur
Posté le 21-06-2010 à 19:27:23  profilanswer
 

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)
n°2003490
Un Program​meur
Posté le 21-06-2010 à 19:28:25  profilanswer
 

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)
n°2003494
jasinski13
Posté le 21-06-2010 à 19:52:39  profilanswer
 

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
 
 

n°2003497
Un Program​meur
Posté le 21-06-2010 à 20:03:18  profilanswer
 

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)
n°2003505
jasinski13
Posté le 21-06-2010 à 20:30:00  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  problème convertion d'une chaine en double

 

Sujets relatifs
Problème de mise à jours avec une requête Microsoft QueryProblème de syntaxe. Mettre 2 classes pour une page
Probleme avec requete sql NOT EXISTS et NOT INproblème de zero binaire dans un enregistrement
Double coteProblème d'authentification en JAVA/J2EE
Problème avec un menu CSSproblème de calcul d'une moyenne en 'double'
Plus de sujets relatifs à : problème convertion d'une chaine en double


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR