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

  FORUM HardWare.fr
  Programmation
  C++

  Conversion char en int, float et double

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Conversion char en int, float et double

n°892501
sylvaing
Posté le 07-11-2004 à 15:04:48  profilanswer
 

Hola todos,
 
Existe t il des fonctions toutes faites dans une bibliotheque C++ pour convertir une chaine de caractere de type char mot[80] en entier et en float (ou double) ? C est tres urgent et je prefererais ne pas a avoir a reecrire une telle macro etant donné que les entiers et les floats que representent mes chaines de caracteres n ont pas tous la meme dimension (pour les entiers de -1 a 10000 et pour les floats de -1.32453 a 15896.22999304456.
 
Si vous avez un truc a me conseillez, une fonction a me proposer, je suis tout ouie :)
 
Muchas gracias :)
 
PS: Une chaine de caractere doit bien se terminer par \n ?

mood
Publicité
Posté le 07-11-2004 à 15:04:48  profilanswer
 

n°892503
Evadream -​jbd-
Posté le 07-11-2004 à 15:07:13  profilanswer
 
n°892522
Taz
bisounours-codeur
Posté le 07-11-2004 à 15:52:22  profilanswer
 

oula.
 
pour faire encore plus simple, y a ce genre de chose dans boost
 

Code :
  1. #include <iostream>
  2. #include <boost/lexical_cast.hpp>
  3. int main()
  4. {
  5.   std::cout << boost::lexical_cast<float>("3.1415" ) << '\n';
  6.   try
  7.     {
  8.       int i;
  9.       i = boost::lexical_cast<int>("42" );
  10.       std::cout << i << '\n';
  11.       i = boost::lexical_cast<int>("Taz" );
  12.       std::cout << i << '\n';
  13.     }
  14.   catch(boost::bad_lexical_cast &e)
  15.     {
  16.       std::cerr << e.what() << '\n'
  17.  << "cast from " << e.source_type().name() <<
  18.  << " to " << e.target_type().name() << " failed\n";
  19.     }
  20. }

n°892562
sylvaing
Posté le 07-11-2004 à 17:14:13  profilanswer
 

Taz a écrit :

oula.
 
pour faire encore plus simple, y a ce genre de chose dans boost
 

Code :
  1. #include <iostream>
  2. #include <boost/lexical_cast.hpp>
  3. int main()
  4. {
  5.   std::cout << boost::lexical_cast<float>("3.1415" ) << '\n';
  6.   try
  7.     {
  8.       int i;
  9.       i = boost::lexical_cast<int>("42" );
  10.       std::cout << i << '\n';
  11.       i = boost::lexical_cast<int>("Taz" );
  12.       std::cout << i << '\n';
  13.     }
  14.   catch(boost::bad_lexical_cast &e)
  15.     {
  16.       std::cerr << e.what() << '\n'
  17.  << "cast from " << e.source_type().name() <<
  18.  << " to " << e.target_type().name() << " failed\n";
  19.     }
  20. }




 
Ca permet de convertir des chaines de caracteres en int, float ou double ?
 
J ai un peu de mal a comprendre comment ca marche....tu peux m eclairer ou me guider un peu ?
 
Gracias :)

n°892567
sylvaing
Posté le 07-11-2004 à 17:30:26  profilanswer
 

Je ne peux pas utiliser
 
#include <boost/lexical_cast.hpp>
 
:(

n°892580
Taz
bisounours-codeur
Posté le 07-11-2004 à 17:46:21  profilanswer
 

si tu peux.
 
comment ça marche ? ben une pauvre fonction template avec un istringstream à l'intérieur. Evadream t'as filé un lien sur comment faire. Y a également des tas d'exemples sur le forum et on a déjà donné des exemples de fonctions générique. Ça tiens en 1 ligne

n°892585
sylvaing
Posté le 07-11-2004 à 17:56:11  profilanswer
 

J ai cette erreur avec ton programme quand je l utilise tel quel....je pense que la bibliotheque n est pas presente :(
 
Error: cannot open file "boost/lexical_cast.hpp"  FILE:convertbis.C LINE:4
*** Interpreter error recovered ***

n°892606
sylvaing
Posté le 07-11-2004 à 18:21:00  profilanswer
 

personne pour m aider :(
 
Au secours...c est super urgent....Je dois rendre le code dans  40min :(

n°892612
docmaboul
Posté le 07-11-2004 à 18:30:22  profilanswer
 

sylvaing a écrit :

personne pour m aider :(
 
Au secours...c est super urgent....Je dois rendre le code dans  40min :(


 
man strtol
man strtof
man strtod
 
edit: c'est du C, mais c'est à peu près standard.


Message édité par docmaboul le 07-11-2004 à 18:31:26
n°892624
sylvaing
Posté le 07-11-2004 à 18:49:34  profilanswer
 

Oki...j utilise strtod pour convertir mes chaines de caractere en float, mais le probleme c est que lorsque j atteint des valeurs comme 123456789,94995843648, il me donne seulement 123456789 :( Est ce qu il y a possibilité d aumenter la precision apres la virgule ?

mood
Publicité
Posté le 07-11-2004 à 18:49:34  profilanswer
 

n°892628
sylvaing
Posté le 07-11-2004 à 19:08:34  profilanswer
 

Personne peux me dire comment obtenir la precision que je veux avec strtof ? :(

n°892630
docmaboul
Posté le 07-11-2004 à 19:19:21  profilanswer
 

sylvaing a écrit :

Oki...j utilise strtod pour convertir mes chaines de caractere en float, mais le probleme c est que lorsque j atteint des valeurs comme 123456789,94995843648, il me donne seulement 123456789 :( Est ce qu il y a possibilité d aumenter la precision apres la virgule ?


 
Oui: il faut utiliser un point ou changer la localisation.

n°892637
sylvaing
Posté le 07-11-2004 à 19:29:36  profilanswer
 

tu peux expliquer concretement comment faire ? je suis completement nul :(

n°892641
docmaboul
Posté le 07-11-2004 à 19:31:58  profilanswer
 

sylvaing a écrit :

tu peux expliquer concretement comment faire ? je suis completement nul :(


 
Vous êtes sur quel os?

n°892648
sylvaing
Posté le 07-11-2004 à 19:38:11  profilanswer
 

Redhat et Windows XP....il faudrait que ca marche sur les deux... mais principalement sous redhat

n°892660
sylvaing
Posté le 07-11-2004 à 19:52:10  profilanswer
 

upupup :(
 
Je pense que je dois utiliser setlocale, mais je ne sais pas comment faire :(


Message édité par sylvaing le 07-11-2004 à 19:52:49
n°892674
docmaboul
Posté le 07-11-2004 à 20:01:18  profilanswer
 

sylvaing a écrit :

Redhat et Windows XP....il faudrait que ca marche sur les deux... mais principalement sous redhat


 
bon, j'imagine que ce n'est pas critique, que vous ne vous servez pas de la chaine de reste (sinon vous auriez su que le problème venait de la virgule) alors on ne va pas se faire chier avec la localisation:
 

Code :
  1. double my_strtod(const char * nptr)
  2. {
  3.   double d;
  4.   char * comma;
  5.   /* on copie la chaine à convertir */
  6.   char * mynptr=strdup(nptr);
  7.   /* on se fait pas chier avec les erreurs d'allocation */
  8.   if ( !mynptr ) return 0;
  9.   /* on suppose qu'il n'y a qu'une seule virgule ou sinon qu'on s'en fout */
  10.   if ( comma=strchr(mynptr, ',') ) (*comma)='.';
  11.   /* on effectue la convertion */
  12.   d=strtod(mynptr, endptr);
  13.   /* on libere la chaine temporaire */
  14.   free(mynptr);
  15.   /* et pis voilà*/
  16.   return d;
  17. }


 
Ca vous va?

n°892689
Taz
bisounours-codeur
Posté le 07-11-2004 à 20:13:05  profilanswer
 

Spoiler :

mais putain vous faites chier à pas vouloir faire de recherche.


 
Doc > t'es un vrai boolay avec ton C. Et je sais pas ce que tu fiches avec ton my_strtod, qui utilise strdup (pas standard). bref il peut pas en faire grand chose. c'est inutilement compliqué et long. et pas générique
 
 
quant à toi sylvaing, tu mérites pas mieux : eva t'as filé un lien avec du code, et t'es même pas foutu de le copier. Tu peux t'en prendre qu'à toi
 

Code :
  1. #include <sstream>
  2. #include <string>
  3. template<typename T>
  4. inline bool valueOf(const std::string &s, T &obj)
  5. {
  6.   std::istringstream is(s);
  7.   return is >> obj;
  8. }
  9. #include <iostream>
  10. int main()
  11. {
  12.   int i;
  13.   std::cout << valueOf("42", i) << '\n'
  14.             << i << '\n';
  15. }

si t'avais pris 2 secondes pour rechercher, t'aurais trouvé ça, qui est similaire au lien d'eva

n°892699
sylvaing
Posté le 07-11-2004 à 20:24:04  profilanswer
 

strdup ne marche pas :(

n°892701
docmaboul
Posté le 07-11-2004 à 20:26:58  profilanswer
 

Taz a écrit :

Doc > t'es un vrai boolay avec ton C. Et je sais pas ce que tu fiches avec ton my_strtod, qui utilise strdup (pas standard). bref il peut pas en faire grand chose. c'est inutilement compliqué et long. et pas générique


 
C'est toujours plus standard que l'utilisation de boost, jeune idiot. Tu me diras, boost, c'est une solution géniale pour pouvoir faire une pauvre conversion à trois francs six sous...
 

Citation :

si t'avais pris 2 secondes pour rechercher, t'aurais trouvé ça, qui est similaire au lien d'eva


 
Manque de chance, il ne pourra toujours pas convertir ses nombres et 3,14 lui donnera toujours 3.00 [:ddr555]

n°892702
docmaboul
Posté le 07-11-2004 à 20:28:51  profilanswer
 

sylvaing a écrit :

strdup ne marche pas :(


 
:kaola:
 

Code :
  1. char * my_strdup(const char * sz)
  2. {
  3.   int len=strlen(sz)+1;
  4.   char * p=malloc(len);
  5.   if (p) memcpy(p, sz, len);
  6.   return p;
  7. }

n°892703
chrisbk
-
Posté le 07-11-2004 à 20:30:20  profilanswer
 

smoche ton C, la méthode taz est achement plus belle

n°892707
docmaboul
Posté le 07-11-2004 à 20:35:41  profilanswer
 

chrisbk a écrit :

smoche ton C, la méthode taz est achement plus belle


 
Déclarer un objet pour faire une pauvre conversion, c'est beau? Ben putain...

n°892710
chrisbk
-
Posté le 07-11-2004 à 20:37:09  profilanswer
 

pis faire de l'alloc dyn pour une pauvre conversion, c'est pas franchement mieux

n°892717
docmaboul
Posté le 07-11-2004 à 20:42:22  profilanswer
 

chrisbk a écrit :

pis faire de l'alloc dyn pour une pauvre conversion, c'est pas franchement mieux


 
je n'avais pas envie qu'il s'embête avec les locales qui peuvent ne pas être installées selon sa plateforme. Sinon, pour squizzer ça, rien de plus facile: setlocale(LC_NUMERIC, "locale_qui_va_bien" ), strtod et c'est torché.


Message édité par docmaboul le 07-11-2004 à 20:42:58
n°892755
Taz
bisounours-codeur
Posté le 07-11-2004 à 21:11:35  profilanswer
 

DocMaboul a écrit :

Déclarer un objet pour faire une pauvre conversion, c'est beau? Ben putain...

et alors ? toi tu viens bien de réinventer la roue ...

mood
Publicité
Posté le   profilanswer
 


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

  Conversion char en int, float et double

 

Sujets relatifs
Un div à hauteur maximale en float?[C++] modulo et double
Conversion String en Pchar[C++] Conversion char * vers wchar_t *
[C] Conversion nombre hexa en decimalProblèmes avec is_float dans mon formulaire
[C++][Drivers] Conversion d'un driver pinnacle Xp vers W2k3Float, Int ---> help !
[C] Probleme de conversion char -> int 
Plus de sujets relatifs à : Conversion char en int, float et double


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