TRANSFORMER UN INT/DOUBLE... EN CHAINE DE CARACTÈRES DE TYPE STRING EN CPP [GCC]

Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 - 25 juil. 2003 à 08:30
hsaturn Messages postés 14 Date d'inscription jeudi 6 octobre 2005 Statut Membre Dernière intervention 3 juin 2007 - 18 mai 2006 à 00:08
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/11117-transformer-un-int-double-en-chaine-de-caracteres-de-type-string-en-cpp-gcc

hsaturn Messages postés 14 Date d'inscription jeudi 6 octobre 2005 Statut Membre Dernière intervention 3 juin 2007
18 mai 2006 à 00:08
Ooops désolé pour la réponse tardive...

Le inline c'est juste histoire d'optimiser. En fait, le compilateur reprend à chaque fois le code et le copie colle à l'endroit de l'appel de la fonction.

On peut oublier et supprimer le inline. Le code fonctionnera de la même manière, surtout si on appele peu cette fonction. D'ailleurs, le inline permet d'aller un peu plus vite, mais cela a un coût : le code est plus gros...

Pour info, ce code est tiré d'une classe CString que j'ai créée pour mes propres besoins. Si ça interresse qqu'un d'avoir CString, yakademander.

Ouala !
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
3 mai 2006 à 23:25
c'est posté en anglais, mais on avait bien compris que tu parlais français ;)
Cethywolf Messages postés 21 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 23 juillet 2006
2 mai 2006 à 13:48
Par contre, j'aimerais que explique le header de ton template, particulièrement "inline".
Merci.
Cethywolf Messages postés 21 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 23 juillet 2006
2 mai 2006 à 13:34
Très simpa et pratique ce code, merci !

Encore mieux le template ^^
hsaturn Messages postés 14 Date d'inscription jeudi 6 octobre 2005 Statut Membre Dernière intervention 3 juin 2007
7 oct. 2005 à 14:18
Ooops, désolé pour le post précédent... rédigé en langue de Shakespeare. Je me suis trompé de bonhomme. Molière s'est-il retourné dans sa tombe ?
Je traduis si qqun ne comprend pas.
Oualou !
hsaturn Messages postés 14 Date d'inscription jeudi 6 octobre 2005 Statut Membre Dernière intervention 3 juin 2007
7 oct. 2005 à 14:16
// I think a lot better solution for this problem is to use templates :

// *********************************
// BEGIN OF YOU JUST NEED THAT
// *********************************
#include
#include <string>
#include <sstream>

using namespace std; // Ugly, but for a demo...

template< class T>
inline string to_string( const T & Value)
{
stringstream streamOut;
streamOut << Value;
return streamOut.str( );
}
// *********************************
// END OF YOU JUST NEED THAT
// *********************************

// *********************************
// BEGIN OF SMALL EXAMPLE
// *********************************

// Thus, you can convert almost all what you what to string.

// Also, this method may write for any kind of object if you provide a friend ostream operator <<
// Example
class cool
{
public:
cool(int i,string s) : mi(i),ms(s){};

friend ostream &operator << (ostream &out,const cool &o);

private:
string ms;
int mi;
};

ostream &operator << (ostream &out,const cool &o)
{
out << "cool {" << o.mi << "," << o.ms << "};" << endl;
return out;
}

// An example of all that :
int main(int argc,char* argv[])
{
string sFloat=to_string(1.2);
string sLong=to_string(1234);
cool mycool(1,"Great");

// And this solves this problem too
// The following line may break your compiler !
//string sBad="cool"+"titi";

// This one is ok
string sOk=to_string("cool")+" isn't it ?";

cout << "float=" << sFloat << endl;
cout << "long=" << sLong << endl;
cout << "ok=" << sOk << endl;

string scool=to_string(mycool);

cout << "mycool=" << scool << endl;

// Note : just for that, you could have writte cout << mycool << endl;

cout << mycool << endl;

return 0;
}

// *********************************
// END OF SMALL EXAMPLE
// *********************************
lgammacurta Messages postés 1 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 12 janvier 2005
12 janv. 2005 à 18:59
Merci pour cette astuce à la fois simple à mettre en oeuvre et efficace. J'ai cherché de mon côté un moyen pour convertir un int en string mais je n'avais rien trouvé d'aussi simple. Bien vu!
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
8 août 2003 à 19:02
Je suis d'accord avec Kirua.
En +, comme tu l'as dis, on peut toujours préciser ponctuellement.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
8 août 2003 à 18:05
merci funto, je savais que pr les bib standards il ne fallait pas mettre le .h, mais je me souviens très nettement qu'une fois un test avait raté à cause de ça, mais il y avait probablement d'autres facteurs, peut-être que mon compilo était en mode C, qui c? ;-)

je trovue que c allourdir le code, quand on peut se passer d'une résolutino de portée, autant en profiter non? en cas de doute du compilo, il est facile de préciser ponctuellement non ?
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
8 août 2003 à 13:42
C'est vrai que ça enlève l'avantage du système de namespace...
Perso, j'aime pas les namespace, je préfère la bonne vieille méthode où on place un préfixe genre gl ou wx ou gtk_...
Et puis ce quelqu'un n'avait pas qu'à faire ça ! :D
cs_tibur Messages postés 101 Date d'inscription samedi 9 février 2002 Statut Membre Dernière intervention 5 mai 2009
8 août 2003 à 12:41
Concernant le "using namespace std;", Je pense qu'il faut eviter de l'utiliser, et plutot specifier directement std:: devant les fonctions de la STL.

Le but du namespace est de faire des 'packages' contenant des fonctions et des classes c++.

Cela evite d'avoir des conflits entre les noms de classes en integrant le travail de quelqu'un d'autre ...
(Genre si ce quelqu'un a codé une classe string ou list, elle va entrer en collision avec celle de la STL)

Enfin, tout ca pour dire que la clause 'using namespace' devrait etre contre indiquée la plupart du temps.
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
8 août 2003 à 10:17
Kirua >> il ne faut pas mélanger les bibliothèques C et C++ : pour utiliser les fonctions de gestion de chaînes de caractères du C (strcpy(), strcat(), strcmp()...etc) il faut faire un #include <string.h>.
Par contre, pour les headers de la bibliothèque standard du C++, il ne faut jamais mettre le .h, donc pour utiliser les string il faut faire :
#include <string>
using namespace std; // A mettre toujours si l'on utilise un fichier de la bibliothèque standard du C++, comme , <vector>...etc.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
8 août 2003 à 02:29
oui VC++ aime pas trop le C++ conforme à ce que j'ai pu voir ;-)
c'est une chouette astuce, merci ! :-)

pr utiliser les string il faut pas inclure <string.h> ??
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
25 juil. 2003 à 11:41
Honte à moi !! Ca fait un bon moment que je le savais, et j'ai dû oublier de mettre using namespace std; quand j'ai fait le test !!
Merci bcp tibur ! Ca me sort 27 warnings mais ça marce qd même alors je m'en fous :D
cs_tibur Messages postés 101 Date d'inscription samedi 9 février 2002 Statut Membre Dernière intervention 5 mai 2009
25 juil. 2003 à 09:09
Ajoutes std:: devant les noms de types string et stringstream
ca te donnes :

std::string s;
std::stringstream sstr;

et pis aussi std::cout
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
25 juil. 2003 à 08:30
Ouais, c'est sympa, mais tout ça ne marche pas sous VC++ 6 :(
Y'a pas de "string" :( Dommage...