Umwandlung int(bzw.double) in Zeichenkette

  • Wie kann ich einen int- bzw. double-Wert in eine Zeichenkette umwandeln? Dafür muss es doch irgendeine Funktion geben !!

    "in 1000 years, we will be living machines, or dead gods"

  • in C: itoa() bzw. ftoa()
    in Java: String.valueOf()
    in C#: <var.-name>.toString()

    ansonsten wäre es sehr hilfreich die Programmiersprache dazuzuschreiben ;)

    Ceterum censeo, carthaginem esse delendam.

  • itoa() funkt einwandfrei, ftoa() kennt der Compiler (Visual C++) nicht. In der Hilfe habe ich zu dieser Funktion auch nichts gefunden. Gehört die wirklich zur Standard-Bibliothek?

    "in 1000 years, we will be living machines, or dead gods"

  • schau mal bei der Hilfe zu itoa(), ob da ein Link dabei ist... maybe heisst das Ding auch dtoa()...

    wenn ich mich recht erinnere sind die Funktionen in der math.h definiert...

    => Is schon ein bißchen länger her, dass ich damit was gemacht habe, genau hab' ich's auch nicht mehr Kopf, sorry...

    Ceterum censeo, carthaginem esse delendam.

  • snprintf könnte auch sehr behilflich sein, wäre noch besser als ftoa, weil du ihm genauere Details angeben kannst, wie das Ding auszusehen hat.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Zitat von RoadRash

    in C: itoa() bzw. ftoa()
    ;)


    MÖÖÖÖPP

    Achtung! itoa() ist keine Funktion, die zum ANSI C Standard gehört. Das bedeutet unter anderem, dass unter den meisten Unices keine Implementierung von itoa() zur Verfügung steht.

    Wenn Du in C portabel einen Integer in einen String umwandeln willst, musst du dafür zB - wie schon von hal vorgeschlagen - sprintf bzw snprintf (C99, dafür sicherer) verwenden.

    In C++ kann die Umwandlung auch mittels eines stringstreams erfolgen:

    int a = 666;
    std::stringstream strstream;
    strstream << a;
    std::string str = strstream.str();

    Mittels dieser Methode kannst Du Dir auch ganz C++-like ein stream_cast<> Template stricken.

    Eins Zwei Gras Bär Hund Vier Muh Macht Die Kuh

  • Zitat von jjan

    Wenn Du in C portabel einen Integer in einen String umwandeln willst, musst du dafür zB - wie schon von hal vorgeschlagen - sprintf bzw snprintf (C99, dafür sicherer) verwenden.

    Wer so Funktionen wie sprintf oder gets verwendet gehört geschlagen, gevierteilt, kielgeholt und am POSIX-Baum aufgeknüpft (ersterer Fall kann entschärft werden, wenn man die Eingabe vorher kontrolliert).

    Ah ja, und du kannst dir auch deine eigene Konvertierungsroutine basteln, ist leichter als es vielleicht klingt.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Zitat von hal

    Wer so Funktionen wie sprintf oder gets verwendet gehört geschlagen, gevierteilt, kielgeholt und am POSIX-Baum aufgeknüpft (ersterer Fall kann entschärft werden, wenn man die Eingabe vorher kontrolliert).



    sprintf mit gets in einen Topf zu werfen, halte ich für übertrieben. gets kann nämlich nur dafür verwendet werden, um User Input zu erhalten.

    sprintf kannst Du aber auch sinnvoll verwenden, ohne User Input zu verarbeiten, und in solchen Fällen ist es ausreichend sicher - nämlich wenn Du bereits im Vorhinein sicher weißt, wieviel Platz Du maximal in Deinem Buffer benötigst.

    Zitat


    Ah ja, und du kannst dir auch deine eigene Konvertierungsroutine basteln, ist leichter als es vielleicht klingt.



    Das brauchst mir ned sagen ;)

    Eins Zwei Gras Bär Hund Vier Muh Macht Die Kuh

  • Ich hab das jetzt so probiert:

    #include <iostream.h>
    #include <strstrea.h>

    int main(){

    int a = 666;
    std::stringstream strstream;
    strstream << a;
    std::string str = strstream.str();
    cout << strstream.str();
    return 0;
    }

    Funktioniert aber nicht!

    Sorry, bin ein C++ Newbie und die Hilfe bei Visual C++ ist Sch.....!

    "in 1000 years, we will be living machines, or dead gods"

  • Zitat von subatomic

    Ich hab das jetzt so probiert:
    #include <strstrea.h>



    Hi, der richtige Header heißt
    <sstream>

    also

    #include <sstream>

    Je nach Version von Visual C++ kann es aber sein, dass es diesen Header noch gar nicht gibt ... der C++ Support von Visual C++ ist leider b0rken (sprich: es wird nur ein Subset des Standards implementiert). Ab der Version 7.0 ist's (angeblich) ein wenig besser.

    Eins Zwei Gras Bär Hund Vier Muh Macht Die Kuh

  • Kann mir jemand einen Vorschlag machen, wie ich Objekte, vorallem aber die Primitives (z.B. int und double) plattformunabhängig in einen char* buffer "schreiben" bzw. "lesen" kann ??
    Hintergrund: Ich würde gern die BerkeleyDB ausprobieren, und die benutzt nun mal Paare typenloser void* Pointer.

    Ich meine also keine toString Funktion, sondern etwas in der Art von java's serialize. Mit den Standardstreams funktioniert dass glaub ich nicht.

    Manuell haben wir das ganze eh schon in SE-Linux angeschnitten, aber eigentlich muß es dass doch auch als Library geben. (Vorallem die float/double Konvertierungen stell ich mir manuell eher schwierig vor).

    Eine Library wäre also fein, aber in die Boost (ansonsten wirklich nett) ist Persistence anscheinend nicht aufgenommen worden, eternity verwaltet das Archiv selber (und gibt keine Zugriffsmöglichkeit auf den Buffer) und die GNU CommonC++ Implementation des Problems halte ich im großen und ganzen für verabscheungswür
    dig (wirklich !, außerdem schreibt der die eingebauten Datentypen über nen Cast rein, dass schaff ich selber auch).

    Der Thread ist zwar schon etwas älter, vielleicht wird der (etwas zu lang geratene) Thread ja trotzdem von jemanden gelesen ...

  • Code
    char buffer[4711];
    float foo=42.678;
    memcpy(mycharbuffer, &foo, sizeof(foo));

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Zitat von hal
    Code
    char buffer[4711];
    float foo=42.678;
    memcpy(mycharbuffer, &foo, sizeof(foo));

    Erstens hätte ich eigentlich gerne eine komplette Klasse (mit unterstützung für STL-Container wenns geht) aus einer halbwegs populären Bibliothek (um den "reinvent the wheel" effekt zu vermeiden)

    Zweitens kann ich mir nicht vorstellen, dass nicht wenigstens schon einer sich an das leidige "primitive Datentypen in einen Buffer schreiben" Problem rangemacht hat (d.h. ich weiß, dass es wer getan hat, kanns aber nicht mehr finden).

    Drittens weiß ich nicht, ob floats die selben Plattform-Probleme haben wie z.B. ints (also LE/BE). Weiß dass jemand ??

    P.S. ist 4711 nicht die Zahl, wegen der manche Leute bei Sysprog wegen abschreibens Punkteabzug bekommen haben ;) ?

    [edit] Naja, CommonC++ geht ja vielleicht doch, aber STL wird halt nicht unterstützt, außerdem hat der Author viele unnötige häßliche Makros benützt, und endian save ist es wie schon erwähnt auch nicht (was mir ja eigentlich wurscht ist, aber es geht ums PRINZIP)

  • Zitat von shabby

    Erstens hätte ich eigentlich gerne eine komplette Klasse (mit überladenen Streams und dem ganzem Kram) aus einer halbwegs populären Bibliothek (um den "reinvent the wheel" effekt zu vermeiden)

    Bin C-Programmierer, nicht C++...

    Zitat

    Zweitens kann ich mir nicht vorstellen, dass nicht wenigstens schon einer sich an das leidige "primitive Datentypen in einen Buffer schreiben" Problem rangemacht hat (d.h. ich weiß, dass es wer getan hat, kanns aber nicht mehr finden).

    naja, meine Methode funktioniert :)

    Zitat

    Drittens weiß ich nicht, ob floats die selben Plattform-Probleme haben wie z.B. ints (also LE/BE). Weiß dass jemand ??

    denke schon, stellt sich halt die frage, ob es nicht nur auf dem System gelesen wird auf dem es geschrieben wurde.

    Zitat

    P.S. ist 4711 nicht die Zahl, wegen der manche Leute bei Sysprog wegen abschreibens Punkteabzug bekommen haben ;) ?

    Keine Ahnung, bin zu jung dafür :)

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Danke Hal für deine Bemühungen, obwohl Sie nicht ganz das Problem adressiert haben
    (sprich: memcpy kannte ich auch)

    Das eigentliche Problem ist, dass du selbst für ein simples Serialisierungsmodul eine Menge faden Kram schreiben mußt -Zum Beispiel write und read Methoden für alle primitiven Datentypen. (char* sind zum Beispiel etwas aufwendiger, weil die Länge irgendwie mitgespeichert und beim auslesen wieder ein buffer angelegt werden muß usw. ) - und ne Menge schwierigen (STL-Container, Probleme mit Pointern ...).
    Was ich nicht unbedingt will.

  • Hi,

    Bewährte portable Bibliotheken, die dieses Problem lösen, kenne ich leider auch nicht ... die MFC stellen AFAIK diese Funktionalität zur Verfügung, aber damit bist du natürlich auf Wintel beschränkt.

    Allerdings gibt es einen Eintrag im comp.lang.c++ FAQ, der genau dieses Thema behandelt, ist recht interessant zu lesen:
    http://www.parashift.com/c++-faq-lite/serialization.html

    Eins Zwei Gras Bär Hund Vier Muh Macht Die Kuh

  • Zitat von jjan


    Bewährte portable Bibliotheken, die dieses Problem lösen, kenne ich leider auch nicht ... die MFC stellen AFAIK diese Funktionalität zur Verfügung, aber damit bist du natürlich auf Wintel beschränkt.

    http://lists.boost.org/MailArchives/boost/msg24288.php erwähnt eben noch die CommonC++ und das etwas bessere eternity-it (das ich durchaus als Alternative zum CArchive ansehen würde). Interessanterweise wurde die Boost Serialization (nach anscheinend längerer Diskussion und Entwicklung) gestoppt.

    Zitat von jjan


    Allerdings gibt es einen Eintrag im comp.lang.c++ FAQ, der genau dieses Thema behandelt, ist recht interessant zu lesen:
    http://www.parashift.com/c++-faq-lite/serialization.html


    [Score 5, Informative]

    Eine letzte Frage sei mir verziehen:

    Zitat von 96' working draft

    The value representation of floating-point types is implementation-defined ...

    Zitat von Serial FAQ

    Note: the floating point differences are the most subtle and tricky to handle. It can be done, but you'll have to be careful with things like NaN, over- and under-flow, #bits in the mantissa or exponent, etc.


    Bedeutet das, dass ich die Repräsentation von Fließkommazahlen auf allen Systemen kennen (d.h. die Repräsentation ist maschinenabhängig) und entsprechend konvertieren muß, oder ist die Repräsentation compilerabhängig (d.h. sie muß logisch und nicht bitwise konvertiert werden) ?
    Nochmalige Entschuldigung für die absolute Irrelevanz meiner Postings (und das noch dazu in den Ferien ! - aber vor Mittag ist mir der See einfach zu kalt...)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!