<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[FAQ - Umwandlung nach std::string und zurück]]></title><description><![CDATA[<p>Es gibt viele Methoden, um zwischen std::string und anderen Typen umzuwandeln.<br />
Dieser Artikel zeigt, wie man es richtig macht, welche Probleme manche Methoden haben und welche man nur in Ausnahmefällen verwenden sollte.</p>
<p><strong>Umwandlungen über boost::lexical_cast</strong></p>
<p>Am einfachsten ist es, lexical_cast aus boost zu verwenden. Boost ist eine riesige Bibliothek an Funktionen und Klassen, die einem das Leben etwas leichter machen, jeder C++ Programmierer sollte sie haben. Boost kann kostenlos unter <a href="http://www.boost.org" rel="nofollow">www.boost.org</a> heruntergeladen werden.</p>
<p>Eingebaute Typen wie int können wir damit ohne weiteren Aufwand umwandeln:</p>
<pre><code class="language-cpp">#include &lt;boost/lexical_cast.hpp&gt;
#include &lt;string&gt;

int main()
{
    int als_int = 42;

    std::string als_string = boost::lexical_cast&lt;std::string&gt;(als_int); // &quot;42&quot;
    int wieder_als_int = boost::lexical_cast&lt;int&gt;(als_string); // 42
}
</code></pre>
<p>Sollte eine Umwandlung nicht gelingen, versucht man z.B. aus &quot;C++&quot; eine Zahl zu machen, wirft lexical_cast eine bad_lexical_cast Exception.</p>
<p>Mit lexical_cast können wir auch eigene Typen umwandeln:</p>
<pre><code class="language-cpp">#include &lt;boost/lexical_cast.hpp&gt;
#include &lt;ostream&gt;
#include &lt;istream&gt;
#include &lt;iomanip&gt;
#include &lt;string&gt;

struct person
{
	std::string name;
	unsigned alter;

	// Wenn wir einen std::string in einen eigenen Typen casten wollen, brauchen wir einen Standardkonstruktor.
	person()
	{}

	person(std::string name, unsigned alter)
		: name(name)
		, alter(alter)
	{}
};

// Das casten nach string geschieht ganz einfach über den operator &lt;&lt;, den wir ganz normal schreiben.
std::ostream&amp; operator &lt;&lt; (std::ostream&amp; os, const person&amp; p)
{
	// Wir trennen Name und Alter durch ein Leerzeichen, damit das Einlesen etwas leichter wird.
	return os &lt;&lt; p.name &lt;&lt; ' ' &lt;&lt; p.alter;
}

// Beim Einlesen müssen wir prüfen, ob Leerzeichen ausgelassen werden oder nicht.
std::istream&amp; operator &gt;&gt; (std::istream&amp; is, person&amp; p)
{
	// Wir holen uns die Formatflags, in denen steht, ob Leerzeichen ausgelassen werden.
	std::ios_base::fmtflags flags = is.flags();

	// Wenn Leerzeichen nicht ausgelassen werden, aktivieren wir das.
	if(!(flags &amp; std::ios::skipws))
		is &gt;&gt; std::skipws;

	// Jetzt können wir ganz normal einlesen.
	is &gt;&gt; p.name &gt;&gt; p.alter;

	// Zu sauberer Programmierung gehört auch, dass wir den alten Status wiederherstellen.
	is.flags(flags);

	return is;
}

int main()
{
	person als_person(&quot;Marc++us&quot;, 40); // Unser Foren-Administrator

	std::string als_string = boost::lexical_cast&lt;std::string&gt;(als_person); // Umwandlung nach std::string
	person wieder_als_person = boost::lexical_cast&lt;person&gt;(als_string); // Umwandlung zurück in eine Person
}
</code></pre>
<p><strong>Umwandlungen über std::stringstream</strong><br />
Mit std::stringstream können wir auch umwandeln, um genau zu sein macht boost::lexical_cast genau das - nur etwas komfortabler - für uns.</p>
<p>Hier kommt noch was, ich fahr jetzt nach Hause. Feedback wäre schon mal super <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291731/faq-umwandlung-nach-std-string-und-zurück</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 11:59:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291731.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Aug 2011 15:01:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 15:02:22 GMT]]></title><description><![CDATA[<p>Es gibt viele Methoden, um zwischen std::string und anderen Typen umzuwandeln.<br />
Dieser Artikel zeigt, wie man es richtig macht, welche Probleme manche Methoden haben und welche man nur in Ausnahmefällen verwenden sollte.</p>
<p><strong>Umwandlungen über boost::lexical_cast</strong></p>
<p>Am einfachsten ist es, lexical_cast aus boost zu verwenden. Boost ist eine riesige Bibliothek an Funktionen und Klassen, die einem das Leben etwas leichter machen, jeder C++ Programmierer sollte sie haben. Boost kann kostenlos unter <a href="http://www.boost.org" rel="nofollow">www.boost.org</a> heruntergeladen werden.</p>
<p>Eingebaute Typen wie int können wir damit ohne weiteren Aufwand umwandeln:</p>
<pre><code class="language-cpp">#include &lt;boost/lexical_cast.hpp&gt;
#include &lt;string&gt;

int main()
{
    int als_int = 42;

    std::string als_string = boost::lexical_cast&lt;std::string&gt;(als_int); // &quot;42&quot;
    int wieder_als_int = boost::lexical_cast&lt;int&gt;(als_string); // 42
}
</code></pre>
<p>Sollte eine Umwandlung nicht gelingen, versucht man z.B. aus &quot;C++&quot; eine Zahl zu machen, wirft lexical_cast eine bad_lexical_cast Exception.</p>
<p>Mit lexical_cast können wir auch eigene Typen umwandeln:</p>
<pre><code class="language-cpp">#include &lt;boost/lexical_cast.hpp&gt;
#include &lt;ostream&gt;
#include &lt;istream&gt;
#include &lt;iomanip&gt;
#include &lt;string&gt;

struct person
{
	std::string name;
	unsigned alter;

	// Wenn wir einen std::string in einen eigenen Typen casten wollen, brauchen wir einen Standardkonstruktor.
	person()
	{}

	person(std::string name, unsigned alter)
		: name(name)
		, alter(alter)
	{}
};

// Das casten nach string geschieht ganz einfach über den operator &lt;&lt;, den wir ganz normal schreiben.
std::ostream&amp; operator &lt;&lt; (std::ostream&amp; os, const person&amp; p)
{
	// Wir trennen Name und Alter durch ein Leerzeichen, damit das Einlesen etwas leichter wird.
	return os &lt;&lt; p.name &lt;&lt; ' ' &lt;&lt; p.alter;
}

// Beim Einlesen müssen wir prüfen, ob Leerzeichen ausgelassen werden oder nicht.
std::istream&amp; operator &gt;&gt; (std::istream&amp; is, person&amp; p)
{
	// Wir holen uns die Formatflags, in denen steht, ob Leerzeichen ausgelassen werden.
	std::ios_base::fmtflags flags = is.flags();

	// Wenn Leerzeichen nicht ausgelassen werden, aktivieren wir das.
	if(!(flags &amp; std::ios::skipws))
		is &gt;&gt; std::skipws;

	// Jetzt können wir ganz normal einlesen.
	is &gt;&gt; p.name &gt;&gt; p.alter;

	// Zu sauberer Programmierung gehört auch, dass wir den alten Status wiederherstellen.
	is.flags(flags);

	return is;
}

int main()
{
	person als_person(&quot;Marc++us&quot;, 40); // Unser Foren-Administrator

	std::string als_string = boost::lexical_cast&lt;std::string&gt;(als_person); // Umwandlung nach std::string
	person wieder_als_person = boost::lexical_cast&lt;person&gt;(als_string); // Umwandlung zurück in eine Person
}
</code></pre>
<p><strong>Umwandlungen über std::stringstream</strong><br />
Mit std::stringstream können wir auch umwandeln, um genau zu sein macht boost::lexical_cast genau das - nur etwas komfortabler - für uns.</p>
<p>Hier kommt noch was, ich fahr jetzt nach Hause. Feedback wäre schon mal super <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110624</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 25 Aug 2011 15:02:22 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 15:07:59 GMT]]></title><description><![CDATA[<p>Zu laaaaaaaannnnng! Das liest doch keiner durch, wenn er sofort von 50+ Zeilen Code erschlagen wird. Wozu das ganze Personenbeispiel? Als Leser dieses FAQ-Eintrages will ich nicht Grundlagen von C++ wiederholen, sondern einfach eine kurze Funktion, die mir aus einem String eine Zahl macht oder umgekehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110627</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 25 Aug 2011 15:07:59 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 15:09:35 GMT]]></title><description><![CDATA[<p>Kann man ja ans Ende des Artikels schieben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110629</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 25 Aug 2011 15:09:35 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 16:12:14 GMT]]></title><description><![CDATA[<p>Lies die FAQ!<br />
<a href="http://www.c-plusplus.net/forum/39488" rel="nofollow">http://www.c-plusplus.net/forum/39488</a></p>
<p>lol, perfekt. Jemand verfasst einen Artikel für die FAQ, welche er selbst gar nicht liest :p<br />
Man könnte sich höchstens mal überlegen, dem FAQ Artikel einen Zusatz mit <code>boost::lexical_cast</code> zu geben. Ist meiner Meinung nach fragwürdig, schliesslich ist Boost immer noch &quot;nur&quot; ein Framework.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110650</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 25 Aug 2011 16:12:14 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 16:48:16 GMT]]></title><description><![CDATA[<p>Viel wichtiger als <code>boost::lexical_cast</code> sind die direkten Stringumwandlungsfunktionen der C++0x-Standardbibliothek, also <code>std::to_string()</code> , <code>std::stoi()</code> und Co. Siehe <a href="http://en.cppreference.com/w/cpp/string" rel="nofollow">hier</a></p>
<p>Davon abgesehen ist dein Code viel zu komplex. Operatorüberladung und Stream-Flags gehören nicht in einen Artikel über String-Umwandlung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110667</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 25 Aug 2011 16:48:16 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 16:48:38 GMT]]></title><description><![CDATA[<p>Ich kenne den Artikel. Wie schon im anderen Thread erwähnt finde ich ihn bestenfalls mangelhaft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110668</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 25 Aug 2011 16:48:38 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 16:49:26 GMT]]></title><description><![CDATA[<p>Wollte ich noch hinzufügen, Nexus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110669</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 25 Aug 2011 16:49:26 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 16:54:31 GMT]]></title><description><![CDATA[<p>Sorry, mein Beitrag vorher war etwas zu scharf und nicht gut genug. War noch am bearbeiten, da habe ich versehentlich auf Absenden geklickt. Und kurz darauf wurde er versehentlich von einem verwirrten Mod (;)) in die FAQ verschoben, wodurch ich nicht mehr editieren konnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Naja, also:<br />
Wie gesagt, wir haben schon eine FAQ Artikel für <code>std::string</code> nach Zahl und zurück. Da sieht man auch gut, wie so ein FAQ Artikel aussehen muss. Kurz und einfach.</p>
<p>Zusätzlich haben wir noch mindestens zwei Artikel, wo das Überladen von den Stream-Operatoren vorkommt:<br />
<a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20(Teil%201)" rel="nofollow">Überladen von Operatoren in C++ (Teil 1)</a><br />
<a href="http://magazin.c-plusplus.net/artikel/Ein-%20und%20Ausgabe%20in%20CPlusPlus%20-%20IO-Streams" rel="nofollow">Ein- und Ausgabe in C++ - IO-Streams</a></p>
<p>Ich würde da wirklich etwas massiv kurzes Schreiben und auf den FAQ-Artikel sowie die beiden Magazin-Artikel verweisen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110672</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 25 Aug 2011 16:54:31 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 17:00:40 GMT]]></title><description><![CDATA[<p>Falls man den FAQ-Artikel verbessern will, schlage ich vor, <code>std::strstream</code> (deprecated) sowie die C-Möglichkeiten nicht mehr zu erwähnen. Allenfalls könnte man letztere in der C-FAQ auflisten.</p>
<p>Also nur noch:</p>
<ul>
<li><strong>C++98:</strong> <code>std::stringstream</code></li>
<li><strong>C++0x:</strong> <code>std::to_string()</code> &amp; Co.</li>
<li><strong>Boost:</strong> <code>boost::lexical_cast</code></li>
</ul>
<p>Aber liest überhaupt jemals jemand die FAQ? Vor allem gibt es etwa 50 andere unwichtige Threads in diesem Bereich, zwischen denen sowas nur untergeht. Dann gibt es noch den Thread &quot;die meistgestellten Fragen&quot;. Klar muss man irgendwo anfangen, aber wenn man die FAQ verbessert, müsste man am besten ein paar einzelne gute Beiträge behalten und den Rest komplett löschen. Vor allem hat eine Forendiskussion nichts in einem FAQ-Thread zu suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110674</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 25 Aug 2011 17:00:40 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 17:06:36 GMT]]></title><description><![CDATA[<blockquote>
<p>person(std::string name, unsigned alter)<br />
: name(name)<br />
, alter(alter)<br />
{}</p>
</blockquote>
<p>*stirnklatsch*<br />
So benennt ein selbsternannter Profi-C++ler also seine member und parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110677</guid><dc:creator><![CDATA[no_comment]]></dc:creator><pubDate>Thu, 25 Aug 2011 17:06:36 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 17:07:08 GMT]]></title><description><![CDATA[<p>Das war genau mein Vorschlag bezüglich des Inhalts @ Nexus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110678</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 25 Aug 2011 17:07:08 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 17:07:55 GMT]]></title><description><![CDATA[<p>no_comment schrieb:</p>
<blockquote>
<blockquote>
<p>person(std::string name, unsigned alter)<br />
: name(name)<br />
, alter(alter)<br />
{}</p>
</blockquote>
<p>*stirnklatsch*<br />
So benennt ein selbsternannter Profi-C++ler also seine member und parameter.</p>
</blockquote>
<p>Und was gibts daran auszusetzen? Weiters habe ich mich nirgens als C++ Profi bezeichnet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110680</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 25 Aug 2011 17:07:55 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 17:11:45 GMT]]></title><description><![CDATA[<p>Der Ansatz sieht schonmal recht brauchbar aus, allerdings läuft zumindest das Beispiel mit den selbstdefinierten IO-Operatoren über's Ziel hinaus. Selbst wenn du mit dem alten FAQ-Beitrag inhaltlich nicht zufrieden bist, könntest du zumindest die grundlegende Struktur übernehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110681</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 25 Aug 2011 17:11:45 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 17:34:23 GMT]]></title><description><![CDATA[<p>Ich schreib sonst mal einen Entwurf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110687</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 25 Aug 2011 17:34:23 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 18:28:24 GMT]]></title><description><![CDATA[<p><em>Hier wäre der Entwurf. Ich habe die Konvertierungen von und zu Strings jeweils zusammengefasst, damit die Ähnlichkeit deutlicher wird. Weiterführende Themen wie Fehlerbehandlung oder zusätzliche Parameter von <code>stoi()</code> etc. habe ich der Einfachheit halber weggelassen. Ich wäre froh um Rückmeldungen und allfällige Verbesserungen.</em></p>
<p>In C++ gibt es verschiedenste Möglichkeiten, Konvertierungen zwischen Zeichenketten (z.B. <code>std::string</code> ) und arithmetischen Typen (z.B. <code>int</code> , <code>double</code> ) vorzunehmen. Im Folgenden sollen die wichtigsten davon erklärt werden.</p>
<p><strong>1. Standard-Konvertierungsfunktionen</strong></p>
<p>Standardbibliotheken, die den C++11-Standard unterstützen, bieten diverse überladene Funktionen im Header <code>&lt;string&gt;</code> an, welche eine direkte Umwandlung zwischen Strings und eingebauten Typen unterstützen. Die Konvertierung von arithmetischen Typen zu Strings erfolgt mit den folgenden überladenen Funktionen:</p>
<ul>
<li><code>to_string()</code> zur Konvertierung in <code>std::string</code></li>
<li><code>to_wstring()</code> zur Konvertierung in <code>std::wstring</code></li>
</ul>
<p>In umgekehrter Richtung existieren folgende Funktionen, die jeweils für <code>std::string</code> - und <code>std::wstring</code> -Parameter überladen sind:</p>
<ul>
<li><code>stoi()</code> für <code>int</code></li>
<li><code>stol()</code> für <code>long</code></li>
<li><code>stoll()</code> für <code>long long</code></li>
<li><code>stoul()</code> für <code>unsigned long</code></li>
<li><code>stoull()</code> für <code>unsigned long long</code></li>
<li><code>stof()</code> für <code>float</code></li>
<li><code>stod()</code> für <code>double</code></li>
<li><code>stold()</code> für <code>long double</code></li>
</ul>
<p>Die Anwendung sieht folgendermassen aus:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

int main()
{
    // Zahl nach String
    double      a = 4.72;
    std::string x = std::to_string(a);

    // String nach Zahl
    std::string y = &quot;5.67&quot;;
    double      b = std::stod(y);
}
</code></pre>
<p><strong>2. Stringstreams</strong></p>
<p>Eine weitere Möglichkeit zur Umwandlung bietet die Klasse <code>std::stringstream</code> . Falls nur Konvertierungen in eine Richtung erforderlich sind, kann <code>std::ostringstream</code> für Output- und <code>std::istringstream</code> für Input-Streams verwendet werden. Für Wide-Strings ( <code>std::wstring</code> ) existieren entsprechende Klassen mit vorangestelltem &quot;w&quot;, z.B. <code>std::wostringstream</code> .</p>
<p>Streams zahlen sich gegenüber den direkten Umwandlungsfunktionen vor allem dann aus, wenn mehrere Werte verkettet werden oder spezielle Stream-Funktionalität (wie Formatflags) erforderlich ist. Die Handhabung ist ähnlich zu <code>std::cout</code> und <code>std::cin</code> , zum Setzen und Auslesen des Strings können die überladenen Methoden <code>str()</code> verwendet werden.</p>
<pre><code class="language-cpp">#include &lt;sstream&gt;
#include &lt;string&gt;

int main()
{
    double a = 4.72;
    int    b = 88;

    // Output-Stream: Zahlen zu String zusammenfügen
    std::ostringstream oss;
    oss &lt;&lt; a &lt;&lt; ' ' &lt;&lt; b;
    std::string x = oss.str();

    // Input-Stream: Zahlen aus String extrahieren
    std::istringstream iss;
    iss.str(&quot;5.67 12&quot;); // oder direkt Konstruktor verwenden
    iss &gt;&gt; a &gt;&gt; b;
}
</code></pre>
<p><strong>3. Boost.LexicalCast</strong></p>
<p><a href="http://www.boost.org" rel="nofollow">Boost</a> ist eine Sammlung von C++-Bibliotheken und enthält unter anderem Funktionalität zur Umwandlung zwischen arithmetischen Datentypen und Zeichenketten. Dazu dient das Funktionstemplate <code>boost::lexical_cast&lt;T&gt;</code> , wobei <code>T</code> den Zieltypen der Konvertierung bezeichnet. Die Syntax ist analog zu den C++-Cast-Operatoren wie z.B. <code>static_cast&lt;T&gt;</code> .</p>
<p>Gegenüber der ersten Variante besteht hier der Vorteil, dass keine C++11-Unterstützung notwendig ist. Im Weiteren ist die Syntax für alle Umwandlungen einheitlich, was generische Programmierung vereinfacht.</p>
<pre><code class="language-cpp">#include &lt;boost/lexical_cast.hpp&gt;
#include &lt;string&gt;

int main()
{
    // Zahl nach String
    double      a = 4.72;
    std::string x = boost::lexical_cast&lt;std::string&gt;(a);

    // String nach Zahl
    std::string y = &quot;5.67&quot;;
    double      b = boost::lexical_cast&lt;double&gt;(y);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2110696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110696</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 25 Aug 2011 18:28:24 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 18:35:52 GMT]]></title><description><![CDATA[<p>Finde ich gut, allerdings sollte zumindest bei boost::lexical_cast auf die Fehlerbehandlung kurz eingegangen werden und bei Streams auf die Referenz verwiesen werden, meiner Meinung nach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110708</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 25 Aug 2011 18:35:52 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 18:51:58 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Finde ich gut, allerdings sollte zumindest bei boost::lexical_cast auf die Fehlerbehandlung kurz eingegangen werden und bei Streams auf die Referenz verwiesen werden, meiner Meinung nach.</p>
</blockquote>
<p>Ich schlage vor, Du kopierst und änderst (machst debei die Änderungen kenntlich). Der nächste kopiert und ändert weiter. Und wenn alle Protagonisten damit zufrieden sind, wird's wohl so gut sein, daß es (unter Streichung aller Änderungsvermerke) in die FAQ gehört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110718</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 25 Aug 2011 18:51:58 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 19:02:28 GMT]]></title><description><![CDATA[<p>Meinst du das erst oder zynisch? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110722</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 25 Aug 2011 19:02:28 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 19:08:46 GMT]]></title><description><![CDATA[<p>Dann kann man auch gleich ein Mercurial-Repository aufsetzen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110724</guid><dc:creator><![CDATA[Ki]]></dc:creator><pubDate>Thu, 25 Aug 2011 19:08:46 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 19:15:24 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Meinst du das erst oder zynisch? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Ich glaube an das Gute.<br />
Ich glaube daran, daß der Artikel schon fast fertig ist und binnen Tagen gegen eine nahezu perfekte Fassung konvergieren wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110730</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 25 Aug 2011 19:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 19:40:57 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Ich glaube daran, daß der Artikel schon fast fertig ist und binnen Tagen gegen eine nahezu perfekte Fassung konvergieren wird.</p>
</blockquote>
<p>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?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110740</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 25 Aug 2011 19:40:57 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 19:54:21 GMT]]></title><description><![CDATA[<p><em>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.</em></p>
<p>Hier einige Möglichkeiten, von <code>int</code> , <code>double</code> usw in <code>std::string</code> (bzw. <code>std::wstring</code> ) und umgekehrt zu konvertieren.</p>
<p><strong>1. Standard-Konvertierungsfunktionen</strong> (nur C++0x, ab GCC 4.?.? oder Visual Studio 2010)</p>
<p>Im neuen Standard gibt es im Header <code>&lt;string&gt;</code> die Funktionen <code>to_string()</code> und <code>to_wstring()</code> zur Konvertierung von nach <code>std::string</code> bzw. <code>std::wstring</code> .<br />
Daneben für <code>std::wstring</code> und <code>std::wstring</code> zu den arithmetischen Typen:</p>
<ul>
<li><code>stoi()</code> für <code>int</code></li>
<li><code>stol()</code> für <code>long</code></li>
<li><code>stoll()</code> für <code>long long</code></li>
<li><code>stoul()</code> für <code>unsigned long</code></li>
<li><code>stoull()</code> für <code>unsigned long long</code></li>
<li><code>stof()</code> für <code>float</code></li>
<li><code>stod()</code> für <code>double</code></li>
<li><code>stold()</code> für <code>long double</code></li>
</ul>
<p>Anwendung:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

int main() {
    // Zahl nach String
    double      a = 4.72;
    std::string x = std::to_string(a);

    // String nach Zahl
    std::string y = &quot;5.67&quot;;
    double      b = std::stod(y);
}
</code></pre>
<p><strong>2. Stringstreams</strong></p>
<p>Wer C++x0 nicht nutzt, kann <code>std::stringstream</code> nehmen. Falls nur Konvertierungen in eine Richtung erforderlich sind, kann <code>std::ostringstream</code> für Output- und <code>std::istringstream</code> für Input-Streams verwendet werden. Für Wide-Strings ( <code>std::wstring</code> ) analog mit vorangestelltem &quot;w&quot;, z.B. <code>std::wostringstream</code> .<br />
Hier lassen sich auch leicht mehrere Werte verkettet werden oder z.B. Formatflags einsetzen. Die Handhabung ist ähnlich zu <code>std::cout</code> und <code>std::cin</code> . Zum Setzen und Auslesen des Strings können die überladenen Methoden <code>str()</code> verwendet werden.</p>
<pre><code class="language-cpp">#include &lt;sstream&gt;
#include &lt;string&gt;

int main() {
    double a = 4.72;
    int    b = 88;

    // Output-Stream: Zahlen zu String zusammenfügen
    std::ostringstream oss;
    oss &lt;&lt; a &lt;&lt; ' ' &lt;&lt; b;
    std::string x = oss.str();

    // Input-Stream: Zahlen aus String extrahieren
    std::istringstream iss;
    iss.str(&quot;5.67 12&quot;); // oder direkt Konstruktor verwenden
    iss &gt;&gt; a &gt;&gt; b;
}
</code></pre>
<p><strong>3. Boost.LexicalCast</strong></p>
<p><a href="http://www.boost.org" rel="nofollow">Boost</a> ist eine beliebte Sammlung von C++-Bibliotheken und enthält unter anderem das Funktionstemplate <code>boost::lexical_cast&lt;T&gt;</code> mit <code>T</code> als Zieltyp der Konvertierung. Die Syntax ist analog zu den C++-Cast-Operatoren wie z.B. <code>static_cast&lt;T&gt;</code> . Die einheitliche Syntax für Umwandlungen vereinfacht generische Programmierung.</p>
<pre><code class="language-cpp">#include &lt;boost/lexical_cast.hpp&gt;
#include &lt;string&gt;

int main() {
    // Zahl nach String
    double      a = 4.72;
    std::string x = boost::lexical_cast&lt;std::string&gt;(a);

    // String nach Zahl
    std::string y = &quot;5.67&quot;;
    double      b = boost::lexical_cast&lt;double&gt;(y);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2110747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110747</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Thu, 25 Aug 2011 19:54:21 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Thu, 25 Aug 2011 20:03:52 GMT]]></title><description><![CDATA[<p>Crap, doch noch ein paar Schnitzer drin.</p>
<p>Die letzten zwei Sätze <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Die Syntax ist analog zu den C++-Cast-Operatoren wie z.B. static_cast&lt;T&gt; und gut geeignet für generische Programmierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110750</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Thu, 25 Aug 2011 20:03:52 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Wed, 31 Aug 2011 07:46:06 GMT]]></title><description><![CDATA[<p>Nur am Rande: Sollte nicht auch zumindest die Rolle der locale erwähnt werden, weil hier auch doubles/Floats vorkommen.<br />
Bei ints spielt es ja keine Rolle.</p>
<p>Just my 2 cents...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2112791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2112791</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 31 Aug 2011 07:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to FAQ - Umwandlung nach std::string und zurück on Wed, 31 Aug 2011 09:42:10 GMT]]></title><description><![CDATA[<p>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 <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>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.</p>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2112829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2112829</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 31 Aug 2011 09:42:10 GMT</pubDate></item></channel></rss>