Toon posts:

[c++] functie voor int naar string

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste mensen,

Ik ben er achter gekomen dat het converteren van int naar string in c++ toch wat complexer ligt dan in andere 'talen' (als bijv. PHP). Ik gebruik die conversie best vaak, dus ik dacht: kom, schrijf er een kleine functie voor:
code:
1
2
3
4
5
6
7
8
9
10
void console2kde::int2str(int theInt, string res){
    stringstream strStream;
    char data[theInt];
    
    strStream << theInt;
    strcpy(data, strStream.str().c_str());
    
    //res = data;
    res = "blaat";
}


De eerste parameter is de int die geconverteerd moet worden, en de tweede parameter zal na uitvoering van de functie de string bevatten. Het klinkt leuk, maar het werkt dus mooi niet :(. Op de een of andere manier komt er gewoon niets uit... In m'n .h-bestand staat het volgende:
code:
1
2
private:
  virtual void int2str(int len, string res);


Deze stukken code heb ik zelf bij elkaar 'verzameld' en gedeeltelijk zelf verzonnen. De functie int2str werkt wel (volgens mij), maar ik denk dat ik de waarde niet goed teruggeef... Iemand een beter idee?

  • raoulduke
  • Registratie: Oktober 2003
  • Niet online

raoulduke

Get in!

Euhm ik ben geen C++ guru, maar:

code:
1
2
3
4
char str[48];
int a=1337;

sprintf(str, "%d", a);

Remember, if you have any trouble you can always send a telegram to the Right People.


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
En probeer anders ltoa eens: http://www.cplusplus.com/ref/cstdlib/ltoa.html

/me weet geen leuke quote voor in zijn signature


Verwijderd

Topicstarter
raoulduke schreef op 30 maart 2004 @ 19:39:
Euhm ik ben geen C++ guru, maar:

code:
1
2
3
4
char str[48];
int a=1337;

sprintf(str, "%d", a);
Hmmmm... Ik geloof dat ik hier nu helemaal niets meer van snap... Dit werkte eerst niet, maar nu opeens wel... Ik denk dat ik perongeluk de vorige keer 'str' niet als character-array heb gedeclareerd, maar als string, en dat schijnt toch weer wat anders te zijn...

  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
probeer dit eens, lijkt me iets netter:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <sstream>
#include <string>
#include <iostream>

void int2str(int a_int, std::string& a_str);

int main()
{
    int i = 19374;
    std::string str;

    int2str(i, str);

    std::cout << str << std::endl;

    return 0;
}

void int2str(int a_int, std::string& a_str)
{
    std::stringstream format;
    format << a_int;
    format >> a_str;
}


volgens mij is strstream deprecated, dus die kun je beter niet meer gebruiken.

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 30 maart 2004 @ 19:35:
Beste mensen,

Ik ben er achter gekomen dat het converteren van int naar string in c++ toch wat complexer ligt dan in andere 'talen' (als bijv. PHP). Ik gebruik die conversie best vaak, dus ik dacht: kom, schrijf er een kleine functie voor:
code:
1
2
3
4
5
6
7
8
9
10
void console2kde::int2str(int theInt, string res){
    stringstream strStream;
    char data[theInt];
    
    strStream << theInt;
    strcpy(data, strStream.str().c_str());
    
    //res = data;
    res = "blaat";
}
Waarvoor is data? En waarom krijgt ie een lengte van theInt? (Wat overigens niet mag, je gebruikt denk ik een compiler extension)

strStream.str () geeft al een str terug, waarom assign je die niet meteen aan res?
De eerste parameter is de int die geconverteerd moet worden, en de tweede parameter zal na uitvoering van de functie de string bevatten. Het klinkt leuk, maar het werkt dus mooi niet :(. Op de een of andere manier komt er gewoon niets uit...
Nee duh, je geeft een string mee als parameter, dat wordt dus een kopie van de parameter die je meegeeft. Wat je wilt is een reference naar string, dan kun je in de functie de string wijzigen. Omdat het een reference is is de wijziging buiten de functie ook nog zichtbaar, omdat het op dezelfde string werkt

Maar buiten dat, waarom specificeer je 'm niet gewoon als return value :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Lone Gunman schreef op 30 maart 2004 @ 19:55:
probeer dit eens, lijkt me iets netter:
geven we tegenwoordig kant en klare oplossingen :?
volgens mij is strstream deprecated, dus die kun je beter niet meer gebruiken.
strstream is idd deprecated, maar ik zie niemand hier 'm gebruiken :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
C++:
1
2
3
4
int x = 1337;
char buffer[33];

itoa(x,buffer,10);


Nu zit in buffer "1337" ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

itoa is echter niet ansi ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik gebruik altijd dit:

C++:
1
2
3
4
5
6
 template <typename T>
std::string toString(const T& t) {
    std::stringstream str;
    str << t;
    return str.str();
}

Verwijderd

Ik ook :)

vergeet
C++:
1
#include <sstream>

niet.

OLOTW:

Met behulp van locales kun je meteen je integer in human readable vorm printen :)

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <sstream>
#include <iostream>
#include <locale>

  /*
   * change locale to the USA one to set 
   * thousands separator to ','
   */
template<typename T>
std::string ToReadableString(const T& t)
{
  std::stringstream ss;
  ss.imbue(std::locale("American_USA.1252"));
  ss << t;
  return ss.str();
}

[ Voor 96% gewijzigd door Verwijderd op 30-03-2004 23:44 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
.oisyn schreef op 30 maart 2004 @ 20:58:
itoa is echter niet ansi ;)
Moet echter de eerste lib nog tegenkomen waar ie niet in zit ...

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Correct me if 'm wrong, maar volgensmij heb ik het geprobeerd met de g++-compiler, en die pikte het niet... Maar ik kan me vergissen!

  • slager
  • Registratie: November 2000
  • Laatst online: 10:18
gcc (en g++) kennen inderdaad _geen_ itoa.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Iets over I rest my case enzo ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Behalve dan gcc ..... :D ( Waarom laten jullie me dan ook niet uitpraten? :) )

[ Voor 53% gewijzigd door farlane op 31-03-2004 10:57 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1