<?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[Teil aus einem String herauslesen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>momentan mache ich folgendes im einen Teilstring aus einem String auszulesen :</p>
<pre><code class="language-cpp">if (*_current == '&lt;')
    {
        char * workptr = _current+1;
        // Next we expect the name of the element to be retrieved
        if (!memcmp(workptr,tag,strlen(tag)))
        {
            char* endtag = (char*)malloc(strlen(tag)+4);
            sprintf(endtag,&quot;&lt;/%s&gt;&quot;,tag);

            // search for the end tag
            char * endptr = strstr(workptr,endtag);
            if (endptr)
            {
                workptr = endptr + strlen(endtag);

                buffer.append(_current,workptr -_current );
                _current = workptr;

                return true;
            }
</code></pre>
<p>D.h. ich habe ein Element z.B. &lt;TAG&gt; und später ein &lt;/TAG&gt; und alles was dazwischen ist, möchte ich in den Buffer einfügen, das geht auch alles prima mit dem Code.</p>
<p>Problematisch wird es allerdings wenn ich in dem String eine Abfolge von folgendem habe :</p>
<p>&lt;TAG&gt;fniifnwinfinf&lt;TAG&gt;fjebfijew&lt;TAG&gt;kfnjfiff&lt;/TAG&gt;kjfbkbfkj&lt;/TAG&gt;kjfbjekfeb&lt;/TAG&gt;</p>
<p>dann würde er mir mit obigem Code ja den Inhalt bei den beiden hinteren &lt;/TAG&gt;s vergessen.</p>
<p>Jetzt wäre meine Überlegung gewesen ob man nicht irgendwie das ganze mit Iteratoren lösen könnte, dass man einen string::iterator von vorne losschickt und das &lt;TAG&gt; suchen lässt und einen string::reverse_iterator von hinten laufen lässt der dann nach &lt;/TAG&gt; sucht...</p>
<p>allerdings weiß ich nicht so recht ob das geht und wenn dann wie ?</p>
<p>Vielleicht habt Ihr ja eine Idee wie ich das am effektivsten lösen kann ...</p>
<p>DANKE</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189256/teil-aus-einem-string-herauslesen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 07:51:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189256.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Aug 2007 11:33:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Teil aus einem String herauslesen on Fri, 10 Aug 2007 11:33:11 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>momentan mache ich folgendes im einen Teilstring aus einem String auszulesen :</p>
<pre><code class="language-cpp">if (*_current == '&lt;')
    {
        char * workptr = _current+1;
        // Next we expect the name of the element to be retrieved
        if (!memcmp(workptr,tag,strlen(tag)))
        {
            char* endtag = (char*)malloc(strlen(tag)+4);
            sprintf(endtag,&quot;&lt;/%s&gt;&quot;,tag);

            // search for the end tag
            char * endptr = strstr(workptr,endtag);
            if (endptr)
            {
                workptr = endptr + strlen(endtag);

                buffer.append(_current,workptr -_current );
                _current = workptr;

                return true;
            }
</code></pre>
<p>D.h. ich habe ein Element z.B. &lt;TAG&gt; und später ein &lt;/TAG&gt; und alles was dazwischen ist, möchte ich in den Buffer einfügen, das geht auch alles prima mit dem Code.</p>
<p>Problematisch wird es allerdings wenn ich in dem String eine Abfolge von folgendem habe :</p>
<p>&lt;TAG&gt;fniifnwinfinf&lt;TAG&gt;fjebfijew&lt;TAG&gt;kfnjfiff&lt;/TAG&gt;kjfbkbfkj&lt;/TAG&gt;kjfbjekfeb&lt;/TAG&gt;</p>
<p>dann würde er mir mit obigem Code ja den Inhalt bei den beiden hinteren &lt;/TAG&gt;s vergessen.</p>
<p>Jetzt wäre meine Überlegung gewesen ob man nicht irgendwie das ganze mit Iteratoren lösen könnte, dass man einen string::iterator von vorne losschickt und das &lt;TAG&gt; suchen lässt und einen string::reverse_iterator von hinten laufen lässt der dann nach &lt;/TAG&gt; sucht...</p>
<p>allerdings weiß ich nicht so recht ob das geht und wenn dann wie ?</p>
<p>Vielleicht habt Ihr ja eine Idee wie ich das am effektivsten lösen kann ...</p>
<p>DANKE</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342150</guid><dc:creator><![CDATA[Tantor]]></dc:creator><pubDate>Fri, 10 Aug 2007 11:33:11 GMT</pubDate></item><item><title><![CDATA[Reply to Teil aus einem String herauslesen on Fri, 10 Aug 2007 11:55:57 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>also ich würde ja mit C++ arbeiten, wenn ich könnte.... <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="😉"
    /><br />
also statt char* mit std::string .. da gibt's dann auch insert() für. (dann aber auch ohne memcpy, strlen, sprintf, ....)</p>
<p>Letztlich kommt es genau zu dem von Dir beschriebenen Problem: Ein längerer String braucht mehr Platz.</p>
<p>Den musst Du also entweder beschaffen (z.B. mit new[] und die bisherigen Daten reinkopieren) oder voraussetzen (einfach &quot;verschieben und hoffen, dass der Aufrufer dafür gesorgt hat, dass er &quot;hinten noch genug Platz&quot; hat.<br />
Dieses &quot;Kopieren und verlängern&quot; erledigt std::string jedenfalls für Dich.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342162</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 10 Aug 2007 11:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to Teil aus einem String herauslesen on Fri, 10 Aug 2007 12:34:21 GMT]]></title><description><![CDATA[<p>Schau dir mal Regular Expressions an... zb in den Boost-Libraries enthalten. Damit sollte das sehr einfach sein...</p>
<p>http:\\<a href="http://boost.org" rel="nofollow">boost.org</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342181</guid><dc:creator><![CDATA[Machine]]></dc:creator><pubDate>Fri, 10 Aug 2007 12:34:21 GMT</pubDate></item><item><title><![CDATA[Reply to Teil aus einem String herauslesen on Fri, 10 Aug 2007 14:56:14 GMT]]></title><description><![CDATA[<p>und an sonnsten würde ich mir halt merken auf welcher ebene du bist ...</p>
<pre><code class="language-cpp">std::string test(&quot;&lt;foo&gt;test01&lt;foo&gt;test2&lt;foo&gt;test3&lt;/foo&gt;&lt;/foo&gt;&lt;/foo&gt;&quot;);
std::size_t pos_beg = test.find_first_of(&quot;&lt;foo&gt;&quot;);
std::size_t pos_end = test.find_first_of(&quot;&lt;/foo&gt;&quot;);
std::cout &lt;&lt; test.substr(pos_beg, pos_end - pos_beg) &lt;&lt; std::endl;
</code></pre>
<pre><code class="language-cpp">void get_tag_string(const std::string&amp; string, const std::string&amp; tag, std::string&amp; result)
{
	std::string tag_beg(&quot;&lt;&quot;);
	tag_beg += tag + &quot;&gt;&quot;;
	std::string tag_end(&quot;&lt;/&quot;);
	tag_end += tag + &quot;&gt;&quot;;

	std::size_t pos_beg = string.find_first_of(tag_beg);
	std::size_t pos_end = string.find_first_of(tag_end, pos_beg);
	std::size_t pos_tmp = string.find_first_of(tag_beg, pos_beg);
	if (pos_tmp &gt; pos_end)
	{
		result = string.substr(pos_beg, pos_end - pos_beg);
		return;
	}
	std::size_t layers = 0;
	for (std::size_t pos = pos_tmp; pos != std::string::npos; pos = string.find_first_of(tag_beg, pos))	++layers;
	for (std::size_t pos = pos_end; pos != std::string::npos &amp;&amp; layers != 0; pos = string.find_first_of(tag_end, pos)) { --layers; pos_end = pos; }
	result = string.substr(pos_beg, pos_beg - pos_end);
}
</code></pre>
<p>sollte schon eher gehen ... ist aber nicht getestet ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342265</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 10 Aug 2007 14:56:14 GMT</pubDate></item></channel></rss>