Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ tyyppien converttaus

Hoover [30.01.2006 20:09:11]

#

Elikkä, olisikohan jossain jotain valmista listaa missä näkyisi tapoja convertata eri tietotyypit kaikkiin yleisimpiin muotoihin (int, double, long, string...)? Helpottaisi kummasti aina kun vaikka tulostaisi lapuskan missä näkyisi nuo.

Tahtoo aina keskeytyä juuri soodaukset johonkin converttausongelmaan, kun pitää ruveta guuglettamaan neuvoja, kun ei tuolta visual studion msdn:stä tahdo löytyä kaikkea (tai sitten en vaan osaa).

Erityisesti nyt tosin olisi hakusessa stringin converttaus integeriksi.

Heikki [30.01.2006 20:12:34]

#

Hoover kirjoitti:

Erityisesti nyt olisi hakusessa tosin tuo stringin converttaus integeriksi.

Jonkinlainen ratkaisu on se, että käytät C:n atoi-funktiota ja sille annat parametrina stringi.c_str():n.

kooderi [30.01.2006 20:20:06]

#

Opettele sscanf():n ja sprintf():n käyttö niin konvertoinnit onnistuvat luvuista stringiksi ja takaisin.

Hoover [30.01.2006 20:21:26]

#

Jeps, näytti toimivan. Kiitoksia.

Metabolix [30.01.2006 20:33:13]

#

Yksi C++:n keino muuttaa tyyppiä jos toistakin on stringstream. Tässä omasta päästä kirjoitettu, toivottavasti toimiva template-funktio, joka muuntaa mitä tahansa, mitä streamiin syöttää:

#include <sstream>
#include <string>

template <class TTyyppiA, class TTyyppiB>
void Muunna(TTyyppiA Lahde, TTyyppiB * Kohde)
{
  std::stringstream Stream; // Stream-olio
  Stream << Lahde; // Syötetään arvo
  Stream >> *Kohde; // Luetaan arvo
}

int main(void)
{
    std::string Str = "04.50";
    double Dbl;
    Muunna(Str, &Dbl); // String doubleksi
    cout << Str << " = " << Dbl << endl;
    return 0;
}

koo [30.01.2006 23:52:16]

#

Jos muuttelee vain tietotyyppejä, voi ekaksi kokeilla ihan tavallista sijoitusta:

int i;
double d;

d = i;

Jos kääntäjä ei valittele mitään, on luultavasti tekemässä ihan järkeviä juttuja. Jos tulee valitusta, kuten tällaisista

short h;
long l;
double d;

h = l;
h = d;

on melko varmasti hukkaamassa jotakin tietoa. Jos tykkää, että tämä on kuitenkin ihan ok ja on asiastaan varma, voi castauksilla kertoa kääntäjälle, että ole sinä hiljaa, kyllä meikäkoodari tietää:

short h;
long l;
double d;

h = static_cast<short>(l);
h = static_cast<short>(d);

Jos on muuntelemassa tietoa stringeiksi tai takaisin, onkin oikeasti tekemässä tulostuksen muotoilua tai syötteen lukua. Homma menee heti paljon monimutkaisemmaksi, kun tarvii oikeastaan varautua maan tapoihin (niin kuin desimaalipilkku vastaan -piste) ja virheelliseen inputtiin. Siis sen lisäksi, että koodi on muutoin oikein.

Stringimuuntelut menevät melko mukavasti stream-luokilla. Kannattaa suosia.

atoi ei sitten pahemmin virheitä tarkastele. Jos välttämättä haluaa tehdä jutut C:mäisesti, kannattaa edes käyttää strtoX-perheen funkkareita.

sprintf ja sscanf ovat yleisiä pointterivirheiden ja puskuriylivuotojen lähteitä, joten siitä sitten vaan...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta