Wie kann ich einen int- bzw. double-Wert in eine Zeichenkette umwandeln? Dafür muss es doch irgendeine Funktion geben !!
Umwandlung int(bzw.double) in Zeichenkette
-
-
in C: itoa() bzw. ftoa()
in Java: String.valueOf()
in C#: <var.-name>.toString()ansonsten wäre es sehr hilfreich die Programmiersprache dazuzuschreiben
-
Danke!!
Und ja, Programmiersprache angegeben ist wirklich keine schlechte Idee.:) -
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?
-
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... -
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.
-
Zitat von RoadRash
in C: itoa() bzw. ftoa()
MÖÖÖÖPPAchtung! 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.
-
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.
-
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 -
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.....! -
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. -
Danke! Jetzt funktioniert's!
-
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 ...
-
-
Zitat von hal
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++...
ZitatZweitens 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
ZitatDrittens 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.
ZitatP.S. ist 4711 nicht die Zahl, wegen der manche Leute bei Sysprog wegen abschreibens Punkteabzug bekommen haben ?
Keine Ahnung, bin zu jung dafür
-
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 -
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 draftThe value representation of floating-point types is implementation-defined ...
Zitat von Serial FAQNote: 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...) -
Wußt ichs doch !
The number '4711' which is tattooed on Frank's leg is the name of a European cologne (the original eau de Cologne, in fact) which was popular among gay men in the 1970's. It is still available.
(aus: "Most popular Horror Trivia Questions") -
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!