FAQ - Umwandlung nach std::string und zurück
-
volkard schrieb:
Ich glaube daran, daß der Artikel schon fast fertig ist und binnen Tagen gegen eine nahezu perfekte Fassung konvergieren wird.
ist der Konvergenzradius denn groß genug? Und ist sicher, dass der Prozess eine ständig steigende Nutzenfunktion zu Folge hat? Gibt es vielleicht mehrere gute Lösungen mit suboptimalen Transienten dazwischen?
-
Finde Nexus Vorschlag schon richtig gut. Ich hab mal versucht, den Text ein bisschen kompakter zu schreiben. Der Code ist identisch außer den öffnenden geschweiften Klammern um jeweils eine Zeile zu sparen.
Hier einige Möglichkeiten, von
int,doubleusw instd::string(bzw.std::wstring) und umgekehrt zu konvertieren.1. Standard-Konvertierungsfunktionen (nur C++0x, ab GCC 4.?.? oder Visual Studio 2010)
Im neuen Standard gibt es im Header
<string>die Funktionento_string()undto_wstring()zur Konvertierung von nachstd::stringbzw.std::wstring.
Daneben fürstd::wstringundstd::wstringzu den arithmetischen Typen:stoi()fürintstol()fürlongstoll()fürlong longstoul()fürunsigned longstoull()fürunsigned long longstof()fürfloatstod()fürdoublestold()fürlong double
Anwendung:
#include <string> int main() { // Zahl nach String double a = 4.72; std::string x = std::to_string(a); // String nach Zahl std::string y = "5.67"; double b = std::stod(y); }2. Stringstreams
Wer C++x0 nicht nutzt, kann
std::stringstreamnehmen. Falls nur Konvertierungen in eine Richtung erforderlich sind, kannstd::ostringstreamfür Output- undstd::istringstreamfür Input-Streams verwendet werden. Für Wide-Strings (std::wstring) analog mit vorangestelltem "w", z.B.std::wostringstream.
Hier lassen sich auch leicht mehrere Werte verkettet werden oder z.B. Formatflags einsetzen. Die Handhabung ist ähnlich zustd::coutundstd::cin. Zum Setzen und Auslesen des Strings können die überladenen Methodenstr()verwendet werden.#include <sstream> #include <string> int main() { double a = 4.72; int b = 88; // Output-Stream: Zahlen zu String zusammenfügen std::ostringstream oss; oss << a << ' ' << b; std::string x = oss.str(); // Input-Stream: Zahlen aus String extrahieren std::istringstream iss; iss.str("5.67 12"); // oder direkt Konstruktor verwenden iss >> a >> b; }3. Boost.LexicalCast
Boost ist eine beliebte Sammlung von C++-Bibliotheken und enthält unter anderem das Funktionstemplate
boost::lexical_cast<T>mitTals Zieltyp der Konvertierung. Die Syntax ist analog zu den C++-Cast-Operatoren wie z.B.static_cast<T>. Die einheitliche Syntax für Umwandlungen vereinfacht generische Programmierung.#include <boost/lexical_cast.hpp> #include <string> int main() { // Zahl nach String double a = 4.72; std::string x = boost::lexical_cast<std::string>(a); // String nach Zahl std::string y = "5.67"; double b = boost::lexical_cast<double>(y); }
-
Crap, doch noch ein paar Schnitzer drin.
Die letzten zwei Sätze
Die Syntax ist analog zu den C++-Cast-Operatoren wie z.B. static_cast<T> und gut geeignet für generische Programmierung.
-
Nur am Rande: Sollte nicht auch zumindest die Rolle der locale erwähnt werden, weil hier auch doubles/Floats vorkommen.
Bei ints spielt es ja keine Rolle.Just my 2 cents...
-
Allzu kurz finde ich nicht gut, ich würde schon die Vorteile der einzelnen Varianten als solche hervorheben, damit gleich klar wird, wann welche Möglichkeit zu verwenden ist. So lange sind die Beschreibungen in meinem Post nun auch wieder nicht

Und was den Code anbelangt: Öffnende und schliessende Klammern auf der gleichen Höhe finde ich um einiges übersichtlicher. Ist ja nicht so, dass wir hier unbedingt die eine Zeile sparen müssten.
Bezüglich Locales: Wäre eine Möglichkeit. Dann würde ich aber auch auf Fehlerbehandlung eingehen. Ich habe solche Dinge wie erwähnt weggelassen, da der Artikel primär eine Übersicht über die verschiedenen Wege zur String-Konvertierung geben soll. Besonders Anfänger sind vielleicht froh, wenn sie gerade die wichtigen Daten auf einen Blick haben. Man könnte aber am Schluss eine Liste mit weiterführenden Links (z.B. über Streams) anfügen.