<?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[Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit]]></title><description><![CDATA[<p>Servus,</p>
<p>habe ein seltsames Problem mit den Keys für eine &lt;map&gt;.<br />
Und zwar habe ich eine std::map&lt;char*, char*&gt; definiert, mit welcher ich das folgende mache:</p>
<pre><code class="language-cpp">std::map&lt;char*, char*&gt; theMap;

    char* testString = &quot;theTest&quot;;
    char* trimString = trim(&quot;   \t   theTest    \n&quot;);

    theMap[&quot;theTest&quot;] = &quot;hier ist ein wert drin&quot;;
    printf(&quot;%s\n&quot;, theMap[&quot;theTest&quot;]);
    printf(&quot;%s\n&quot;, theMap[testString]);
    printf(&quot;%s\n&quot;, theMap[trimString]);
</code></pre>
<p>Die trim()-Funktion habe ich selbst geschrieben, da ich bisher leider nichts vergleichbares in der Standardlib finden konnte. Sie sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">char* trim(const char* str)
{
    int len = strlen(str);
    int start = 0;
    int end = len;

    for(int i=0; i&lt;len; i++)
        if (str[i] &gt; 0x20)
        {
            start = i;
            break;
        }

    for(int i=len; i&gt;0; i--)
        if (str[i] &gt; 0x20)
        {
            end = i+1;
            break;
        }

    len = end - start;
    char* result = new char[len];
    strncpy(result, str + start, len);
    return result;
}
</code></pre>
<p>So, nun zum Problem: Ich füge also einen Wert unter einem bestimmten Key (&quot;theTest&quot;) in die Map ein, und versuche nun, diesen auf drei unterschiedliche Arten wieder auszulesen. Bei der ersten, also einem literalen String, funktioniert es, bei der zweiten, über ein char*, funktioniert es ebenfalls.<br />
Bei der dritten jedoch nicht.</p>
<p>Jetzt ist die erste Überlegung natürlich, daß es an der eigenen trim()-Funktion liegt. Daher habe ich nun einfach mal versucht, den zurückgegebenen String mit dem anderen zu vergleichen, aber der Vergleich bestätigt mir eigentlich, daß die trim()-Funktion wie erwartet funktioniert:</p>
<pre><code class="language-cpp">printf(&quot;%i\n&quot;, strcmp(&quot;theTest&quot;, &quot;theTest&quot;));   // nur um rauszufinden, daß bei Gleichheit eine 0 rauskommen muß
printf(&quot;%i\n&quot;, strcmp(&quot;theTest&quot;, trimString));
printf(&quot;%i\n&quot;, strcmp(testString, trimString));
</code></pre>
<p>Eigentlich müßte doch dann auch der Map-Zugriff ohne Probleme funktionieren, aber das ist eben nicht der Fall. Woran kann das liegen?</p>
<p>Ich hoffe ihr könnt mir helfen!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182766/problem-mit-lt-map-gt-bzw-string-gleichheit</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 00:49:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182766.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 May 2007 07:33:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 07:48:23 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>habe ein seltsames Problem mit den Keys für eine &lt;map&gt;.<br />
Und zwar habe ich eine std::map&lt;char*, char*&gt; definiert, mit welcher ich das folgende mache:</p>
<pre><code class="language-cpp">std::map&lt;char*, char*&gt; theMap;

    char* testString = &quot;theTest&quot;;
    char* trimString = trim(&quot;   \t   theTest    \n&quot;);

    theMap[&quot;theTest&quot;] = &quot;hier ist ein wert drin&quot;;
    printf(&quot;%s\n&quot;, theMap[&quot;theTest&quot;]);
    printf(&quot;%s\n&quot;, theMap[testString]);
    printf(&quot;%s\n&quot;, theMap[trimString]);
</code></pre>
<p>Die trim()-Funktion habe ich selbst geschrieben, da ich bisher leider nichts vergleichbares in der Standardlib finden konnte. Sie sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">char* trim(const char* str)
{
    int len = strlen(str);
    int start = 0;
    int end = len;

    for(int i=0; i&lt;len; i++)
        if (str[i] &gt; 0x20)
        {
            start = i;
            break;
        }

    for(int i=len; i&gt;0; i--)
        if (str[i] &gt; 0x20)
        {
            end = i+1;
            break;
        }

    len = end - start;
    char* result = new char[len];
    strncpy(result, str + start, len);
    return result;
}
</code></pre>
<p>So, nun zum Problem: Ich füge also einen Wert unter einem bestimmten Key (&quot;theTest&quot;) in die Map ein, und versuche nun, diesen auf drei unterschiedliche Arten wieder auszulesen. Bei der ersten, also einem literalen String, funktioniert es, bei der zweiten, über ein char*, funktioniert es ebenfalls.<br />
Bei der dritten jedoch nicht.</p>
<p>Jetzt ist die erste Überlegung natürlich, daß es an der eigenen trim()-Funktion liegt. Daher habe ich nun einfach mal versucht, den zurückgegebenen String mit dem anderen zu vergleichen, aber der Vergleich bestätigt mir eigentlich, daß die trim()-Funktion wie erwartet funktioniert:</p>
<pre><code class="language-cpp">printf(&quot;%i\n&quot;, strcmp(&quot;theTest&quot;, &quot;theTest&quot;));   // nur um rauszufinden, daß bei Gleichheit eine 0 rauskommen muß
printf(&quot;%i\n&quot;, strcmp(&quot;theTest&quot;, trimString));
printf(&quot;%i\n&quot;, strcmp(testString, trimString));
</code></pre>
<p>Eigentlich müßte doch dann auch der Map-Zugriff ohne Probleme funktionieren, aber das ist eben nicht der Fall. Woran kann das liegen?</p>
<p>Ich hoffe ihr könnt mir helfen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294206</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Tue, 29 May 2007 07:48:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 08:02:42 GMT]]></title><description><![CDATA[<p>Eigentlich ganz einfach: Die Map macht keinen strcmp-Vergleich, sondern einen ==-Vergleich (woher soll sie auch wissen dass Du nicht den ==-Vergleich wünschst). Damit macht sie nur Zeiger-Vergleiche und keine String-Vergleiche. Und zwei Zeiger auf den gleichen String(-Inhalt) müssen nicht zwangsläufig auf die gleiche Adresse zeigen.</p>
<p>Lösung: Nimm std::string.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294223</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 29 May 2007 08:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 08:11:41 GMT]]></title><description><![CDATA[<p>Hmmm okay, das klingt natürlich einleuchtend. Aber warum geht dann das hier?</p>
<pre><code class="language-cpp">printf(&quot;%s\n&quot;, theMap[&quot;theTest&quot;]); 
    printf(&quot;%s\n&quot;, theMap[testString]);
</code></pre>
<p>Könnte das an einer Compiler-Optimierung liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294229</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Tue, 29 May 2007 08:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 08:15:22 GMT]]></title><description><![CDATA[<p>Warum sollte das nicht gehen, wenn du mit genau diesen Zeigern etwas in die Map reingesteckt hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294233</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 29 May 2007 08:15:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 08:17:34 GMT]]></title><description><![CDATA[<p>Nein mir ging's jetzt darum, weil es ja einmal direkt ein Literal ist und einmal ein char*, habe nun aber die EXE angeschaut, dort ist der String tatsächlich nur einmal vorhanden, in dem Fall hat das der Compiler wohl bemerkt und entsprechend beidesmal die gleiche Adresse verwendet.</p>
<p>Hmmm die std::strings sollen aber teilweise ihre Problemchen haben, hab ich zumindest gehört... oder was meint ihr dazu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294237</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Tue, 29 May 2007 08:17:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 08:32:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::map&lt;std::string, std::string&gt; theMap;

std::string sTest = &quot;theTest&quot;;
std::string sTrim(&quot;   \t   theTest    \n&quot;);
std::string sTrimTest(trim(sTrim.c_str()));

theMap[sTest] = &quot;hier ist ein wert drin&quot;;
std::cout &lt;&lt; sTest &lt;&lt; &quot; =&gt; &quot; &lt;&lt; theMap[sTest] &lt;&lt; std::endl;
std::cout &lt;&lt; sTrim &lt;&lt; &quot; =&gt; &quot; &lt;&lt; theMap[sTrimTest] &lt;&lt; std::endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1294247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294247</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 29 May 2007 08:32:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 08:59:32 GMT]]></title><description><![CDATA[<p>Rock Lobster schrieb:</p>
<blockquote>
<p>Hmmm die std::strings sollen aber teilweise ihre Problemchen haben, hab ich zumindest gehört...</p>
</blockquote>
<p>So, hast Du gehört? Ich 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>Wo hast Du das denn gehört und von welchen Problemchen war die Rede?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294268</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 29 May 2007 08:59:32 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 09:12:46 GMT]]></title><description><![CDATA[<p>Kann ich auch nicht so recht sagen, ich hatte bisher nur immer irgendwie im Hinterkopf &quot;std::string ist scheiße, char* ist okay&quot;. Zwar war mir schon bekannt, daß std::strings einige nette Funktionen bieten, aber irgendwie meine ich gehört zu haben, daß es da oft Schwierigkeiten gibt, wenn man die verwendet. Habe da aber nichts konkretes dazu, und bin ehrlich gesagt auch ganz froh, wenn ich höre, daß sie tatsächlich zu gebrauchen sind und auch verwendet werden sollten <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>@ (D)Evil: Jepp, funktioniert <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="😉"
    /> werde das jetzt wohl so nutzen.</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294277</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Tue, 29 May 2007 09:12:46 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 09:27:56 GMT]]></title><description><![CDATA[<p>Wenn du nicht mehr weißt, woher du diese Aussage hast, solltest du sie ganz schnell vergessen <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="😉"
    /> std::string ist im Regelfall einfacher zu handhaben und auch mächtiger als char*. Du mußt nur aufpassen, daß du keinen Mist damit baust (Bereichsüberschreitungen oder ähnliche Spielereien).</p>
<p>Rock Lobster schrieb:</p>
<blockquote>
<p>Hmmm okay, das klingt natürlich einleuchtend. Aber warum geht dann das hier?</p>
<pre><code class="language-cpp">printf(&quot;%s\n&quot;, theMap[&quot;theTest&quot;]); 
    printf(&quot;%s\n&quot;, theMap[testString]);
</code></pre>
</blockquote>
<p>testString ist ein Zeiger auf ein String-Literal. Und wenn der Compiler feststellt, daß ein identisches Literal schon besteht, muß er es nur einmal anlegen. Anders würde es aussehen, wenn du <code>char testString[]=&quot;theTest&quot;;</code> geschrieben hättest.</p>
<p>PS: Auf string-Ebene wäre die trim-Funktion um einiges kürzer:</p>
<pre><code class="language-cpp">string trim(const string&amp; src)
{
  size_t start=src.find_first_not_of(&quot; \n\t&quot;);
  size_t ende =src.find_last_not_of(&quot; \n\t&quot;);
  return src.substr(start,ende-start+1);
}
</code></pre>
<p>(achtung - nicht getestet)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294292</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 29 May 2007 09:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 11:01:12 GMT]]></title><description><![CDATA[<p>Jo stimmt, das sieht schön kompakt aus <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="🙂"
    /><br />
Okay dann werde ich in Zukunft wohl std::string benutzen. Gibt es dennoch irgendwelche Anwendungsfälle, wo man lieber zu char* greifen sollte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294348</guid><dc:creator><![CDATA[Rock Lobster]]></dc:creator><pubDate>Tue, 29 May 2007 11:01:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;lt;map&amp;gt; bzw. String-Gleichheit on Tue, 29 May 2007 11:02:43 GMT]]></title><description><![CDATA[<p>Das einzige, was mir da einfällt, sind C-Bibliotheken. Und da kannst du den char*-Einsatz normalerweise lokal kapseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294349</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 29 May 2007 11:02:43 GMT</pubDate></item></channel></rss>