<?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[Mal wieder String nach Zahl (FAQ)]]></title><description><![CDATA[<p>Um das FAQ-Topic (<a href="http://c-plusplus.net/forum/viewtopic-var-t-is-39488.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-t-is-39488.html</a>) mal etwas zu vertiefen:</p>
<p>b) String nach Zahl</p>
<p>Ist die generelle Verwendung der Umwandlung in der folgenden Art eigentlich &quot;teuer&quot;?</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;sstream&gt;
using namespace std;
int main()
{  
	string s(&quot;123&quot;);
	int a;

	istringstream(s) &gt;&gt; a;
}
</code></pre>
<p>Welche der im Topic beschriebenen 5 Wege nehmt ihr wirklich in der Praxis?</p>
<p>Das obige hat die Eigneschaft dass der Wert von a nicht geändert wird wenn die Umwandlung fehlschlägt, also zum Beispiel wenn der String gar keine Zahl darstellt.<br />
Allgemein kann man oben noch gut ne Fehlerbehandlung einbauen, z.b.:</p>
<pre><code class="language-cpp">if ((istringstream(s) &gt;&gt; a).fail()) a=0;
</code></pre>
<p>oder rabiater</p>
<pre><code class="language-cpp">if ((istringstream(s) &gt;&gt; a).fail()) throw exception();
</code></pre>
<p>Wer die Zuweisung offensichtlicher sehen will könnte's auch so schreiben, wobei ganz rechts auch der &quot;Default&quot;-Wert schön lesbar ist.</p>
<pre><code class="language-cpp">a = !(istringstream(s) &gt;&gt; a).fail() ? a : 0;
</code></pre>
<p>Eure &quot;Best Practices&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/265950/mal-wieder-string-nach-zahl-faq</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 16:41:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265950.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 May 2010 15:41:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mal wieder String nach Zahl (FAQ) on Sat, 01 May 2010 15:41:42 GMT]]></title><description><![CDATA[<p>Um das FAQ-Topic (<a href="http://c-plusplus.net/forum/viewtopic-var-t-is-39488.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-t-is-39488.html</a>) mal etwas zu vertiefen:</p>
<p>b) String nach Zahl</p>
<p>Ist die generelle Verwendung der Umwandlung in der folgenden Art eigentlich &quot;teuer&quot;?</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;sstream&gt;
using namespace std;
int main()
{  
	string s(&quot;123&quot;);
	int a;

	istringstream(s) &gt;&gt; a;
}
</code></pre>
<p>Welche der im Topic beschriebenen 5 Wege nehmt ihr wirklich in der Praxis?</p>
<p>Das obige hat die Eigneschaft dass der Wert von a nicht geändert wird wenn die Umwandlung fehlschlägt, also zum Beispiel wenn der String gar keine Zahl darstellt.<br />
Allgemein kann man oben noch gut ne Fehlerbehandlung einbauen, z.b.:</p>
<pre><code class="language-cpp">if ((istringstream(s) &gt;&gt; a).fail()) a=0;
</code></pre>
<p>oder rabiater</p>
<pre><code class="language-cpp">if ((istringstream(s) &gt;&gt; a).fail()) throw exception();
</code></pre>
<p>Wer die Zuweisung offensichtlicher sehen will könnte's auch so schreiben, wobei ganz rechts auch der &quot;Default&quot;-Wert schön lesbar ist.</p>
<pre><code class="language-cpp">a = !(istringstream(s) &gt;&gt; a).fail() ? a : 0;
</code></pre>
<p>Eure &quot;Best Practices&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890965</guid><dc:creator><![CDATA[scrontch]]></dc:creator><pubDate>Sat, 01 May 2010 15:41:42 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder String nach Zahl (FAQ) on Sat, 01 May 2010 15:49:45 GMT]]></title><description><![CDATA[<p>Ich verwende<a href="http://www.boost.org/doc/libs/1_42_0/libs/conversion/lexical_cast.htm" rel="nofollow"> <code>boost::lexical_cast</code> </a>. Sehr angenehm zu handhaben und wirft eine Exception bei einem Fehler. Intern baut es auf die C++ Streams auf.</p>
<p>Die C++ Streams haben einiges an Overhead, aber meistens fällt das nicht ins Gewicht.</p>
<p>Übrigens zu Exceptions bei Streams:<br />
<a href="http://www.cplusplus.com/reference/iostream/ios/exceptions/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/exceptions/</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890969</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 01 May 2010 15:49:45 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder String nach Zahl (FAQ) on Sat, 01 May 2010 15:50:50 GMT]]></title><description><![CDATA[<p>Es gibt noch eine 6. bekannte Möglichkeit:</p>
<pre><code class="language-cpp">std::string myString = &quot;123&quot;;
int myInt = boost::lexical_cast&lt;int&gt;(myString);
</code></pre>
<p>Wirft bei Fehlschlag eine Exception und ist für einzelne Umwandlungen relativ kompakt. Benötigt allerdings die Boost-Bibliothek (welche von vielen C++-Programmierern verwendet wird).</p>
<p>Ohne Boost kannst du dir auch mit wenigen Zeilen Code eine ähnliche Funktion schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890970</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 01 May 2010 15:50:50 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder String nach Zahl (FAQ) on Sat, 01 May 2010 16:00:54 GMT]]></title><description><![CDATA[<p>Um einen Default-Wert im Fehlerfall zu setzen, bietet sich</p>
<pre><code class="language-cpp">a = default_wert;
istringstream(str) &gt;&gt; a;
</code></pre>
<p>an. Wenn der Default-Wert 0 und der Typ von a bekannt ist, sind atoi, atof etc. durchaus vertretbar, aber innerhalb einer Template geht das natürlich nicht.</p>
<p>Ansonsten hängt die Wahl des Mittels natürlich vom Use-Case ab - oft parst man beispielsweise aus einem std::istream &amp;, und dann macht es, wenn man einen String als Quelle hat, natürlich wenig Sinn, etwas anderes als std::istringstream zu benutzen.</p>
<p>Was Performance angeht - der Overhead der C++-Streams war einst recht groß, da ist aber inzwischen bei allen gängigen Compilern viel geschehen. Zudem stellt sich diese besondere Problematik in der Praxis sowieso meistens in Zusammenhängen, in denen Performance nicht von übergeordneter Bedeutung ist, etwa bei Benutzereingaben auf der Konsole oder per GUI. Es kommt höchst selten vor, dass dort mehr als ein paar Zahlen geparst werden müssen, und bei größeren Datenmengen bemüht man im Zweifel eh eine Datei und meistens auch eine spezielle Parser-Bibliothek.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890976</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 01 May 2010 16:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder String nach Zahl (FAQ) on Sat, 01 May 2010 17:39:53 GMT]]></title><description><![CDATA[<p>scrontch schrieb:</p>
<blockquote>
<p>Ist die generelle Verwendung der Umwandlung in der folgenden Art eigentlich &quot;teuer&quot;?</p>
</blockquote>
<p>Ja. Aber wie Du siehst, stimmen die Vorurteile gegenüber C++-Programmierern.</p>
<p>scrontch schrieb:</p>
<blockquote>
<p>Eure &quot;Best Practices&quot;?</p>
</blockquote>
<p>Irgendwie brauche ich das gar nicht. Beim Einlesen der Daten benutze ich &gt;&gt; und danach speichere ich Zahlen in Zahlentypen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891004</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 01 May 2010 17:39:53 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder String nach Zahl (FAQ) on Sat, 01 May 2010 17:56:02 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if (!(istringstream(s) &gt;&gt; a)) { /* Error! */ }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1891008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891008</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Sat, 01 May 2010 17:56:02 GMT</pubDate></item></channel></rss>