<?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[Elegante Version zu &amp;quot;extractstring&amp;quot;]]></title><description><![CDATA[<p>Guten Morgen zusammen,</p>
<p>motiviert durch die vielen schönen Beispiele hier im Forum versuche ich derzeit meinen eigenen Code stilistisch etwas aufzubessern.</p>
<p>Konkret probiere ich mich gerade an folgender Funktion<br />
<code>string extractstring(string&amp; s, const char&amp; delim)</code> ,<br />
die als Ergebnis den Anfangsteils von <code>s</code> bis zum ersten Auftreten des Zeichens <code>delim</code> (oder ganz <code>s</code> , falls <code>delim</code> nicht vorkommt) liefern soll und dabei am Anfang von <code>s</code> den entsprechenden Teilstring einschließlich des Trennzeichens löscht.</p>
<p>Ursprünglich habe ich das so gelöst:</p>
<pre><code class="language-cpp">string extractstring(string&amp; s, const char&amp; delim){
  size_t pos=s.find(delim);
  string res=s.substr(0,pos);
  s.erase(0,pos);
  if(!s.empty())
    s.erase(0,1);
  return res;
}
</code></pre>
<p>Besonders am Ende ist das etwas &quot;fummelig&quot; und ich dachte, das geht vielleicht auch eleganter, gerade auch weil die Standard-Funktion <code>getline</code> beinahe das gewünschte liefert.</p>
<p>Die Überarbeitung ist mir aber auch nicht recht geklückt und sieht so aus:</p>
<pre><code class="language-cpp">string extractstring(string&amp; s, const char&amp; delim){
  stringstream tmp;

  tmp &lt;&lt; noskipws &lt;&lt; s;
  string res;
  getline(tmp,res,delim);

  stringbuf* buf=new stringbuf;
  tmp &gt;&gt; buf;
  s=buf-&gt;str();
  delete buf;

  return res;
}
</code></pre>
<p>Ab dem getline ist das garnicht so, wie ich mir das vorgestellt habe.</p>
<p>Vermutlich hilt vor allem &quot;mehr Erfahrung sammeln&quot;, über Hinweise für ein besseres Vorgehen würde ich mich trotzdem freuen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285039/elegante-version-zu-quot-extractstring-quot</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 13:24:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285039.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Apr 2011 09:11:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Elegante Version zu &amp;quot;extractstring&amp;quot; on Wed, 13 Apr 2011 09:11:31 GMT]]></title><description><![CDATA[<p>Guten Morgen zusammen,</p>
<p>motiviert durch die vielen schönen Beispiele hier im Forum versuche ich derzeit meinen eigenen Code stilistisch etwas aufzubessern.</p>
<p>Konkret probiere ich mich gerade an folgender Funktion<br />
<code>string extractstring(string&amp; s, const char&amp; delim)</code> ,<br />
die als Ergebnis den Anfangsteils von <code>s</code> bis zum ersten Auftreten des Zeichens <code>delim</code> (oder ganz <code>s</code> , falls <code>delim</code> nicht vorkommt) liefern soll und dabei am Anfang von <code>s</code> den entsprechenden Teilstring einschließlich des Trennzeichens löscht.</p>
<p>Ursprünglich habe ich das so gelöst:</p>
<pre><code class="language-cpp">string extractstring(string&amp; s, const char&amp; delim){
  size_t pos=s.find(delim);
  string res=s.substr(0,pos);
  s.erase(0,pos);
  if(!s.empty())
    s.erase(0,1);
  return res;
}
</code></pre>
<p>Besonders am Ende ist das etwas &quot;fummelig&quot; und ich dachte, das geht vielleicht auch eleganter, gerade auch weil die Standard-Funktion <code>getline</code> beinahe das gewünschte liefert.</p>
<p>Die Überarbeitung ist mir aber auch nicht recht geklückt und sieht so aus:</p>
<pre><code class="language-cpp">string extractstring(string&amp; s, const char&amp; delim){
  stringstream tmp;

  tmp &lt;&lt; noskipws &lt;&lt; s;
  string res;
  getline(tmp,res,delim);

  stringbuf* buf=new stringbuf;
  tmp &gt;&gt; buf;
  s=buf-&gt;str();
  delete buf;

  return res;
}
</code></pre>
<p>Ab dem getline ist das garnicht so, wie ich mir das vorgestellt habe.</p>
<p>Vermutlich hilt vor allem &quot;mehr Erfahrung sammeln&quot;, über Hinweise für ein besseres Vorgehen würde ich mich trotzdem freuen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048541</guid><dc:creator><![CDATA[thomas___]]></dc:creator><pubDate>Wed, 13 Apr 2011 09:11:31 GMT</pubDate></item><item><title><![CDATA[Reply to Elegante Version zu &amp;quot;extractstring&amp;quot; on Wed, 13 Apr 2011 09:20:37 GMT]]></title><description><![CDATA[<p>Die erste Version war schon gut (auch wenn ich nicht erwarten würde, dass delim weder in s, noch im Return-Wert erhalten bleibt). Die zweite Version ist dagegen ziemlich umständlich und außerdem unperformant, also eine klare Verschlimmbesserung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048549</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 13 Apr 2011 09:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Elegante Version zu &amp;quot;extractstring&amp;quot; on Wed, 13 Apr 2011 09:27:28 GMT]]></title><description><![CDATA[<p>Ich finde solche Funktionen gefährlich, da sie zwar einen Rückgabewert haben, aber ein Funktionsargument verändern. Der Parameter ist zwar keine const Referenz, aber ich würde, wenn ich die Funktionssignatur sehe, nicht erwarten, dass der Eingabestring verändert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048553</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 13 Apr 2011 09:27:28 GMT</pubDate></item></channel></rss>