Conversion char en int, float et double

Conversion char en int, float et double - C++ - Programmation

Marsh Posté le 07-11-2004 à 15:04:48    

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 ?

Reply

Marsh Posté le 07-11-2004 à 15:04:48   

Reply

Marsh Posté le 07-11-2004 à 15:07:13    

Reply

Marsh Posté le 07-11-2004 à 15:52:22    

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

Reply

Marsh Posté le 07-11-2004 à 17:14:13    

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

Reply

Marsh Posté le 07-11-2004 à 17:30:26    

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

Reply

Marsh Posté le 07-11-2004 à 17:46:21    

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

Reply

Marsh Posté le 07-11-2004 à 17:56:11    

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 ***

Reply

Marsh Posté le 07-11-2004 à 18:21:00    

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

Reply

Marsh Posté le 07-11-2004 à 18:30:22    

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
Reply

Marsh Posté le 07-11-2004 à 18:49:34    

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 ?

Reply

Marsh Posté le 07-11-2004 à 18:49:34   

Reply

Marsh Posté le 07-11-2004 à 19:08:34    

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

Reply

Marsh Posté le 07-11-2004 à 19:19:21    

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.

Reply

Marsh Posté le 07-11-2004 à 19:29:36    

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

Reply

Marsh Posté le 07-11-2004 à 19:31:58    

sylvaing a écrit :

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


 
Vous êtes sur quel os?

Reply

Marsh Posté le 07-11-2004 à 19:38:11    

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

Reply

Marsh Posté le 07-11-2004 à 19:52:10    

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
Reply

Marsh Posté le 07-11-2004 à 20:01:18    

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?

Reply

Marsh Posté le 07-11-2004 à 20:13:05    

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

Reply

Marsh Posté le 07-11-2004 à 20:24:04    

strdup ne marche pas :(

Reply

Marsh Posté le 07-11-2004 à 20:26:58    

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]

Reply

Marsh Posté le 07-11-2004 à 20:28:51    

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

Reply

Marsh Posté le 07-11-2004 à 20:30:20    

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

Reply

Marsh Posté le 07-11-2004 à 20:35:41    

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

Reply

Marsh Posté le 07-11-2004 à 20:37:09    

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

Reply

Marsh Posté le 07-11-2004 à 20:42:22    

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
Reply

Marsh Posté le 07-11-2004 à 21:11:35    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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