ANSI C++ Conversion int to string

ANSI C++ Conversion int to string - C++ - Programmation

Marsh Posté le 16-04-2004 à 18:41:40    

Salut!
 
Quelqu'un saurait comment convertir un int en string avec ANSI C++ vu que la fonction itoa() n'existe pas en ANSI?
 
En fait je voudrais générer n noms de variable du genre objet_i en faisant une boucle sur i
 
Merci!

Reply

Marsh Posté le 16-04-2004 à 18:41:40   

Reply

Marsh Posté le 16-04-2004 à 18:44:50    

Code :
  1. #include <sstream>
  2. std::ostringstream out;
  3. out << 42;
  4. std::cout << out.str() << '\n';


 
t'as fait du PHP toi (:pfff:)
fais un tableau


Message édité par Taz le 16-04-2004 à 18:45:08
Reply

Marsh Posté le 16-04-2004 à 18:55:04    

C pas con avec les stream... Merci, jva essayer
 
c pas pour php, et c pas possible un tableau car je doit faire une animation sous gimp et mes variables sont des images devant s'appeler image_i
Merci!

Reply

Marsh Posté le 16-04-2004 à 19:00:40    

bah change tes histoires de gimp et utilise un tableau. on a jamais vu des variable_i

Reply

Marsh Posté le 02-09-2007 à 15:36:06    


Dans le même genre de choses, voici le problème
qui me résiste :
 
J'ai écrit une fonction permettant de transformer un int en un string  
(etant débutant, je sais que cette fonction est primitive)
 
 

Code :
  1. /**
  2. * Cette fonction permet de convertir
  3. * un entier en chaines de caractères. <br>
  4. */
  5. string IntegerUtils::toString(int p_nEntier) {
  6. // Variables locales
  7. char *tChar = new char[33];
  8. int nEntier = p_nEntier;
  9. // Test
  10. if (p_nEntier == 0)
  11.  return *(new string("0" )); // Renvoi "0" si l'entier esr nul
  12. // Boucle
  13. int nReste;
  14. int nCursor = 0;
  15. while (nEntier > 0) {
  16.  // Calcul du reste
  17.  nReste = nEntier % 10;
  18.  // Ajout du reste dans le tableau
  19.  switch (nReste) {
  20.   case 0:
  21.    *(tChar + nCursor) = '0';
  22.    break;
  23.   case 1:
  24.    *(tChar + nCursor) = '1';
  25.    break;
  26.   case 2:
  27.    *(tChar + nCursor) = '2';
  28.    break;
  29.   case 3:
  30.    *(tChar + nCursor) = '3';
  31.    break;
  32.   case 4:
  33.    *(tChar + nCursor) = '4';
  34.    break;
  35.   case 5:
  36.    *(tChar + nCursor) = '5';
  37.    break;
  38.   case 6:
  39.    *(tChar + nCursor) = '6';
  40.    break;
  41.   case 7:
  42.    *(tChar + nCursor) = '7';
  43.    break;
  44.   case 8:
  45.    *(tChar + nCursor) = '8';
  46.    break;
  47.   case 9:
  48.    *(tChar + nCursor) = '9';
  49.    break;
  50.  }
  51.  // Incrémentation
  52.  nCursor++;
  53.  nEntier = (nEntier - nReste) / 10;
  54. };
  55. // Renvoi et construction  
  56. char *tRes = new char[nCursor];
  57. for (int i = 0; i < nCursor; ++i) {
  58.  *(tRes + i) = *(tChar + (nCursor - i - 1));
  59. }
  60. // Retourne la chaine
  61. return *(new string(tRes));
  62. }


 
Pour la tester, j'ai créé une classe de test (en utilisant la librairie CPPUNIT)
avec la fonction suivante :
 

Code :
  1. /**
  2. * Cette méthode permet de tester la conversion
  3. * d'un entier vers une chaine de caractères; <br>
  4. */
  5. void IntegerUtilsTest::testToString() {
  6. // Variables :
  7. int nEntier = 17;
  8. string *strChaine;
  9. // 1er Tests
  10. strChaine = new string("17" );
  11. CPPUNIT_ASSERT_EQUAL(*strChaine, IntegerUtils::toString(nEntier));
  12. delete strChaine;
  13. // 2ième Test
  14. strChaine = new string("1234" );
  15. nEntier = 1234;
  16. CPPUNIT_ASSERT_EQUAL(*strChaine, IntegerUtils::toString(nEntier));
  17. }


 
Lorsque je lance les tests unitaires, j'obtiens le résultat suivant :
 

Code :
  1. $ ./prog_test.exe
  2. .....................F
  3. !!!FAILURES!!!
  4. Test Results:
  5. Run:  21   Failures: 1   Errors: 0
  6. 1) test: testToString (F) line: 40 src/test/basic/IntegerUtilsTest.cpp
  7. equality assertion failed
  8. - Expected: 17
  9. - Actual  : 17=


 
Et, donc, ma question est de savoir d'où vient ce satané signe égal   :??:  :??:  
 
Si quelqu'un peut m'aider, je lui en serai reconnaissant  :jap:  
 
merci d'avançe

Reply

Marsh Posté le 02-09-2007 à 15:49:12    

ta fonction ne sert strictement à rien :o.
Tu as tout ce qui te faut avec les std::stringstream [:dawa]

 

sinon, 100€ que tu ne gére pas correctement ta mémoire et ton '\0' terminal.

 

Bordel, en plus bonjour M. JAVA qui fait du C++

 

return *(new string("0" ));
ca mérite le pal !

 

return string("0" ) ca suffit hein. Go Back to your Lessons boy ;)

Message cité 2 fois
Message édité par Joel F le 02-09-2007 à 15:50:28
Reply

Marsh Posté le 02-09-2007 à 15:58:33    

Joel F a écrit :

ta fonction ne sert strictement à rien :o.  
Tu as tout ce qui te faut avec les std::stringstream [:dawa]
 
sinon, 100€ que tu ne gére pas correctement ta mémoire et ton '\0' terminal.
 
Bordel, en plus bonjour M. JAVA qui fait du C++
 
return *(new string("0" ));
ca mérite le pal !
 
return string("0" ) ca suffit hein. Go Back to your Lessons boy ;)


 
 
Merci Dr House  :jap:  
 
C'est vrai : je viens de JAVA : j'en suis désolé pour les puristes mais
cela m'a beaucoup appris, surtout sur la POO. En conséquence, je demande humblement
votre indulgence (et non le pal !!)
 
Par contre, et là je suis sérieux, si tu as une bonne documentation sur  
les bonnes pratiques en C++, je suis preneur  :jap:  
 
PS : J'espère que ta jambe ne te fait pas trop souffrir

Reply

Marsh Posté le 02-09-2007 à 17:14:37    

c'est une blague [:mlc] ?

Reply

Marsh Posté le 02-09-2007 à 18:08:07    

casper78 a écrit :

les bonnes pratiques en C++, je suis preneur  :jap:  
 
PS : J'espère que ta jambe ne te fait pas trop souffrir


* arrêter d'enculer les mouches
* utiliser std::string
 
 
Ah oui, j'oubliais : apprendre le C++

Reply

Marsh Posté le 02-09-2007 à 18:20:20    

casper78 a écrit :


C'est vrai : je viens de JAVA


C'ets comme les gens qui sortent de PHP, ils font des tableaux avec des trucs genre [iidentifiant_i[/i].
Les mecs de JAVA fotn des new partout :o
 

casper78 a écrit :


Par contre, et là je suis sérieux, si tu as une bonne documentation sur  
les bonnes pratiques en C++, je suis preneur  :jap:  


Le cours qui a fait de moi l'Homme que je susi : http://www.bruno-garcia.net/www/Cours/
Plus de bon cours (et pas le site de l'infame zero) : http://cpp.developpez.com/cours/cppavance/
Thinkign In C++ : http://bruce-eckel.developpez.com/livres/cpp/ticpp/
La STL (sans qui il ne faut jamais sortir sans :o) : http://cpp.developpez.com/cours/stl/
 

casper78 a écrit :


PS : J'espère que ta jambe ne te fait pas trop souffrir


Ca ira :o

Reply

Marsh Posté le 02-09-2007 à 18:20:20   

Reply

Marsh Posté le 02-09-2007 à 18:27:07    

Joel F a écrit :


C'ets comme les gens qui sortent de PHP, ils font des tableaux avec des trucs genre [iidentifiant_i[/i].
Les mecs de JAVA fotn des new partout :o
 


 

Joel F a écrit :


Le cours qui a fait de moi l'Homme que je susi : http://www.bruno-garcia.net/www/Cours/
Plus de bon cours (et pas le site de l'infame zero) : http://cpp.developpez.com/cours/cppavance/
Thinkign In C++ : http://bruce-eckel.developpez.com/livres/cpp/ticpp/
La STL (sans qui il ne faut jamais sortir sans :o) : http://cpp.developpez.com/cours/stl/
 


 


 
 
Cher Joel F
 
Merci pour ton aide et effectivement c'était une mauvaise gestion
de la mémoire.
 
Donc, je vais aller potasser ces précieux documents.
 
Je profite, du temps de parole qu'il m'est donné, pour rassurer
Taz et KangOl : je promets de ne plus faire subir aux mouches, mes
appetits sexuels dépravés  ;)  
 

Reply

Marsh Posté le 20-09-2007 à 14:05:46    

Joel F a écrit :

ta fonction ne sert strictement à rien :o.  
Tu as tout ce qui te faut avec les std::stringstream [:dawa]
 
sinon, 100€ que tu ne gére pas correctement ta mémoire et ton '\0' terminal.
 
Bordel, en plus bonjour M. JAVA qui fait du C++
 
return *(new string("0" ));
ca mérite le pal !
 
return string("0" ) ca suffit hein. Go Back to your Lessons boy ;)


 
return string("0" ) -> ca aussi ca merite le pal !!! ;-)
 
Ta variable string("0" )  a un scope limite a celui de la fonction . Aussi des que tu fais le return, elle n'existe plus .  
 
Ce code risque de marcher tant que tu ne fais pas de choses trop compliquees, mais essaie de faire du multithread et je te garantis que ta fonction ne retournera pas la string "0".  
 
Dáilleurs avec Visual C++, tu vas avoir un warning du style : returning reference to local variable or temporary .
 

Reply

Marsh Posté le 20-09-2007 à 14:17:36    

fortune

Reply

Marsh Posté le 20-09-2007 à 15:41:28    

dinaiz a écrit :


return string("0" ) -> ca aussi ca merite le pal !!! ;-)


 
Quand on ne sait pas , on se tait.
 

Code :
  1. string getZero()
  2. {
  3.   return string("0" );
  4. }
  5. string s = getZero();


 
cree un objet temporaire dans le scope de la fonction. En sortie, il est copié sur la pile (par appel du copy constructor)
et ensuite atterri dans s.
 
C != C++ hein :o
Apres ofc, si tu fait ca avec des classes sans copy semantic, faut pas venir chialer.
(et je ne ferais pas d'attaque basse sur le fait que ,lol, tu utilise VC comme référence :o)

Reply

Marsh Posté le 20-09-2007 à 15:51:43    

Nan, mais VC (au moins le 2005) n'a pas ce comportement hein :D
(au moins il faudrait tester et préciser l'environnement utiliser avant de sortir ça)

Reply

Marsh Posté le 20-09-2007 à 16:33:42    

Si il l'a. C'est le comportement du C++.

Reply

Marsh Posté le 20-09-2007 à 16:36:56    

Taz a écrit :

Si il l'a. C'est le comportement du C++.


j'ai dit une bétise ?  [:absolutelykaveh]

Reply

Marsh Posté le 20-09-2007 à 16:37:36    

Tu le règles comment pour l'avoir ce warning dans ce cas? (J'ai justement en /W4, mais nada :/)

Reply

Marsh Posté le 20-09-2007 à 16:43:37    

Joel F a écrit :


j'ai dit une bétise ?  [:absolutelykaveh]


bah non, je répondais à l'histoire du "c'est pas comme ça dans VS"

Reply

Marsh Posté le 20-09-2007 à 16:44:14    

IrmatDen a écrit :

Tu le règles comment pour l'avoir ce warning dans ce cas? (J'ai justement en /W4, mais nada :/)


Peut-être le fait qu'il n'y ait pas de warning signifie en fait qu'il n'y a pas de warning.

Reply

Marsh Posté le 20-09-2007 à 16:55:45    

Euh, dans ce cas, y'a quiproquo, je répondais à Dinaiz et Joel F qui glisse une attaque discrète sur VC :)
Edit: pour clarifier complètement, y'a pas de warning avec VS2005 donc.


Message édité par IrmatDen le 20-09-2007 à 16:56:23
Reply

Marsh Posté le 20-09-2007 à 17:00:22    

surprenant !

Reply

Marsh Posté le 16-11-2007 à 19:52:49    

Taz a écrit :

* arrêter d'enculer les mouches
* utiliser std::string


 :??: C'est quoi l'idée ? Tu crois qu'en mettant std::string(100) il va te sortir une string avec "100" ?  
T'es un comique.
 
Pauvre garçon.
 
 
Et puis, pour peu qu'elle soient un peu velues, c'est du bonheur!
 
 :hello:

Reply

Marsh Posté le 16-11-2007 à 20:55:39    

toi, tu ferais mieux d'avaler ta langue et d'apprendre à lire :o
oh et en même temps, regarder les dates de topics c'est pas mal :o

Reply

Marsh Posté le 16-11-2007 à 20:55:44    

Non, pas string(100) bien sûr... Tu utilises un istringstream en le liant à un string et tu as une méthode plus simple, plus lisible et plus robuste que son while, son switch etc...
Tu fais pas pareil quand même?  [:petrus dei]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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