<?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[Eigenes explode()]]></title><description><![CDATA[<p>Moin!<br />
Es gab immer in PHP so eine schicke Funktion Namens explode(), die einen Array aus Strings zurücklieferte. Anzugeben ist dabei ein String mit der Quelle und ein String mit dem Seperatorzeichen. Also</p>
<pre><code>$str = &quot;eins|zwei|drei&quot;;
$arr = explode(&quot;|&quot;, $str) //liefert array(&quot;eins&quot;, &quot;zwei&quot;, &quot;drei&quot;) zurück
</code></pre>
<p>So etwas ähnliches wollte ich mir in C++ nachbasteln. Mein Code sieht derzeit so aus:</p>
<pre><code class="language-cpp">void explode(vector&lt;string&gt;* vec, string s, string sep)
{
	string tmp = s;
	int pos;

	while((pos = tmp.find(sep)) != string::npos)
	{
		vec-&gt;push_back(tmp.substr(0, pos));
		tmp = tmp.substr(pos);
	}
}
</code></pre>
<p>Die while-Schleife terminiert nicht. Es wird lediglich das erste Element gelesen und dann bleibt tmp immer gleich. Irgendwie habe ich mich festgefahren und mein debugger spinnt ein wenig (Man sollte keinen Beta-Quatsch zum entwickeln einsetzen <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/topic/118051/eigenes-explode</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Apr 2026 17:41:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/118051.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Aug 2005 14:20:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigenes explode() on Sun, 14 Aug 2005 14:20:05 GMT]]></title><description><![CDATA[<p>Moin!<br />
Es gab immer in PHP so eine schicke Funktion Namens explode(), die einen Array aus Strings zurücklieferte. Anzugeben ist dabei ein String mit der Quelle und ein String mit dem Seperatorzeichen. Also</p>
<pre><code>$str = &quot;eins|zwei|drei&quot;;
$arr = explode(&quot;|&quot;, $str) //liefert array(&quot;eins&quot;, &quot;zwei&quot;, &quot;drei&quot;) zurück
</code></pre>
<p>So etwas ähnliches wollte ich mir in C++ nachbasteln. Mein Code sieht derzeit so aus:</p>
<pre><code class="language-cpp">void explode(vector&lt;string&gt;* vec, string s, string sep)
{
	string tmp = s;
	int pos;

	while((pos = tmp.find(sep)) != string::npos)
	{
		vec-&gt;push_back(tmp.substr(0, pos));
		tmp = tmp.substr(pos);
	}
}
</code></pre>
<p>Die while-Schleife terminiert nicht. Es wird lediglich das erste Element gelesen und dann bleibt tmp immer gleich. Irgendwie habe ich mich festgefahren und mein debugger spinnt ein wenig (Man sollte keinen Beta-Quatsch zum entwickeln einsetzen <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/851990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/851990</guid><dc:creator><![CDATA[hackbert]]></dc:creator><pubDate>Sun, 14 Aug 2005 14:20:05 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Sun, 14 Aug 2005 14:27:56 GMT]]></title><description><![CDATA[<p>Wenn</p>
<pre><code class="language-cpp">pos = tmp.find(sep);
</code></pre>
<p>einmal etwas gefunden hat dann findet es immer wieder die selbe stelle.<br />
Lösung:</p>
<pre><code class="language-cpp">tmp = tmp.substr(pos + sep.length() );
</code></pre>
<p>Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/851992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/851992</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Sun, 14 Aug 2005 14:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Sun, 14 Aug 2005 15:20:52 GMT]]></title><description><![CDATA[<p>Danke. Genau das war's!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/852021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852021</guid><dc:creator><![CDATA[hackbert]]></dc:creator><pubDate>Sun, 14 Aug 2005 15:20:52 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Sun, 14 Aug 2005 15:47:43 GMT]]></title><description><![CDATA[<p>Noch ein Lösungsvorschlag:</p>
<pre><code class="language-cpp">void explode( vector&lt;string&gt;&amp; res, string const&amp; str, string const&amp; sep )
{
  string::size_type begin = 0, end;
  while ((end = str.find(sep, begin)) != string::npos) {
    res.push_back(str.substr(begin, end-begin));
    begin = end + sep.length();
  }
  res.push_back(str.substr(begin));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/852037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852037</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Sun, 14 Aug 2005 15:47:43 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Sun, 14 Aug 2005 16:57:24 GMT]]></title><description><![CDATA[<p>Kann man die Funktion auch so programmieren das man den push_back Aufruf nur an einer Stelle im Code hat? Also das man kein seperates push_back für das letzte Token braucht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/852071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852071</guid><dc:creator><![CDATA[:)-]]></dc:creator><pubDate>Sun, 14 Aug 2005 16:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Sun, 14 Aug 2005 17:21:46 GMT]]></title><description><![CDATA[<p>Ich bin für das hier --&gt;</p>
<pre><code class="language-cpp">void stringExplode(vector&lt;string&gt;&amp; vec, string const&amp; line, string const&amp; delims)
{
    string::size_type begIdx, endIdx = 0;
    while( (begIdx = line.find_first_not_of(delims, endIdx))!= string::npos )
    {
        endIdx = line.find_first_of(delims, begIdx);
        vec.push_back( line.substr(begIdx, endIdx - begIdx) );
    }
}
</code></pre>
<p>hmpf fehler korrigiert^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/852081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852081</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Sun, 14 Aug 2005 17:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Sun, 14 Aug 2005 17:58:05 GMT]]></title><description><![CDATA[<p>:)- schrieb:</p>
<blockquote>
<p>Kann man die Funktion auch so programmieren das man den push_back Aufruf nur an einer Stelle im Code hat? Also das man kein seperates push_back für das letzte Token braucht...</p>
</blockquote>
<pre><code class="language-cpp">void explode( vector&lt;string&gt;&amp; res, string const&amp; str, string const&amp; sep )
{
  string::size_type begin = 0, end;
  do {
    end = str.find(sep, begin);
    res.push_back(str.substr(begin, end-begin));
    begin = end + sep.length();
  } while (end != string::npos);
}
</code></pre>
<p>Ging ja nur fix um's Prinzip.. da gibt's sicher noch einiges zu verbessern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/852109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852109</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Sun, 14 Aug 2005 17:58:05 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Sun, 14 Aug 2005 17:58:20 GMT]]></title><description><![CDATA[<p>aber deine variante hat jetzt 2 x nen find Aufruf und ist somit wahrscheinlich lahmer <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/852111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852111</guid><dc:creator><![CDATA[hehe]]></dc:creator><pubDate>Sun, 14 Aug 2005 17:58:20 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Mon, 15 Aug 2005 08:04:55 GMT]]></title><description><![CDATA[<p>Morgen,</p>
<p>nicht zu vergessen: boost::algorithm::split <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>mfg<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/852351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852351</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Mon, 15 Aug 2005 08:04:55 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Mon, 15 Aug 2005 08:56:23 GMT]]></title><description><![CDATA[<p>finix schrieb:</p>
<blockquote>
<p>:)- schrieb:</p>
<blockquote>
<p>Kann man die Funktion auch so programmieren das man den push_back Aufruf nur an einer Stelle im Code hat? Also das man kein seperates push_back für das letzte Token braucht...</p>
</blockquote>
<pre><code class="language-cpp">void explode( vector&lt;string&gt;&amp; res, string const&amp; str, string const&amp; sep )
{
  string::size_type begin = 0, end;
  do {
    end = str.find(sep, begin);
    res.push_back(str.substr(begin, end-begin));
    begin = end + sep.length();
  } while (end != string::npos);
}
</code></pre>
<p>Ging ja nur fix um's Prinzip.. da gibt's sicher noch einiges zu verbessern.</p>
</blockquote>
<p>Vielen Dank für die Funktion. <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="🙂"
    /><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Ich hatte es bis jetzt immer mit 2 push_backs gesehen und dachte es geht nicht anders.<br />
Ich brauchte auch so eine Split-Funktion für mein Programm und ich habe noch mit einem zusätzlichen Parameter festgelegt, wie leere Token behandelt werden. Und diese Abfrage hatte ich dann an 2 Stellen was ich nicht so gut fand. <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>
<p>Aber was soll man denn da noch verbessern können? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <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/852370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852370</guid><dc:creator><![CDATA[:)-]]></dc:creator><pubDate>Mon, 15 Aug 2005 08:56:23 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Mon, 15 Aug 2005 09:13:33 GMT]]></title><description><![CDATA[<p>:)- schrieb:</p>
<blockquote>
<p>Aber was soll man denn da noch verbessern können? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <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>
</blockquote>
<p>Z.b. das er nicht in jedem Schleifendurchlauf sep.length() aufruft.<br />
Evtl. optimiert der Compiler das, evtl. auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/852378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852378</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Mon, 15 Aug 2005 09:13:33 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes explode() on Mon, 15 Aug 2005 10:59:19 GMT]]></title><description><![CDATA[<p>:)- schrieb:</p>
<blockquote>
<p>Aber was soll man denn da noch verbessern können? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <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>
</blockquote>
<p>Das war eher designtechnisch zu verstehen.. so ist die Beschränkung auf vector&lt;string&gt; z.B. nicht allzu hübsch, also:</p>
<pre><code class="language-cpp">template &lt;typename OutputIterator&gt;
void explode( OutputIterator it, string const&amp; str, string const&amp; sep )
{
  const string::size_type sepLength = sep.length();
  string::size_type begin = 0, end;
  do {
    end = str.find(sep, begin);
    *it = str.substr(begin, end-begin);
    ++it;
    begin = end + sepLength;
  } while (end != string::npos);
}

void explode( vector&lt;string&gt;&amp; res, string const&amp; str, string const&amp; sep )
{
  explode(back_inserter&lt; vector&lt;string&gt; &gt;(res), str, sep);
}
</code></pre>
<p>Dann taucht natürlich die Frage auf wie mit leeren Tokens zu verfahren ist. Mehrere Separatoren? etc.</p>
<p>Spinnt man das weiter wird man am Ende wohl wirklich bei boost::algorithm::split oder boost::tokenizer oder so ähnlich landen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/852454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/852454</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Mon, 15 Aug 2005 10:59:19 GMT</pubDate></item></channel></rss>