<?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[String vs. char* vs. const char*]]></title><description><![CDATA[<p>Hi,</p>
<p>ich steh noch ziemlich am Beginn von C++. Die meisten Sorgen bereiten mir im Moment Strings und char*. Einerseits ist mir noch nicht ganz klar, wann ich was benutzen soll, andererseits sind es die Konvertierungen. Ich könnte jetzt noch einige Dinge aufzählen, aber ich will ja eure Geduld nicht überstrapazieren, daher EIN;) konkretes Problem:</p>
<p>Ich habe eine Funktion mit einem string Parameter. Wenn ich diesen Parameter in der Funktion in einen const char* mittel c_str() umwandle enthälte er nur das erste Zeichen. Wenn ich aber in der Funktion dem Parameter einen Wert zuweise funktioniert es.</p>
<p>Ich glaube mit Code ist es ein wenig verständlicher:</p>
<pre><code>void foo(string input)
{
   cout &lt;&lt; input &lt;&lt; endl;   // String ist gefuellt

   const char* bar = input.c_str();

   cout &lt;&lt; bar &lt;&lt; endl;      // Nur das 1.Zeichen :( ?!?
}
</code></pre>
<p>Wenn ichs aber so versuche, funktioniert es:</p>
<pre><code>void foo(string input)
{
   input = &quot;blablab&quot;;

   const char* bar = input.c_str();

   cout &lt;&lt; bar &lt;&lt; endl;      // String ist gefüllt
}
</code></pre>
<p>Hat das was mit CallbyValue und CallbyReference zu tun? Bzw. wie bringe ich die erste Version zum Laufen?</p>
<p>Bitte helft mir :)!</p>
<p>mfg,<br />
soad</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177285/string-vs-char-vs-const-char</link><generator>RSS for Node</generator><lastBuildDate>Thu, 25 Jun 2026 11:18:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177285.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 29 Mar 2007 20:15:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String vs. char* vs. const char* on Thu, 29 Mar 2007 22:42:39 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich steh noch ziemlich am Beginn von C++. Die meisten Sorgen bereiten mir im Moment Strings und char*. Einerseits ist mir noch nicht ganz klar, wann ich was benutzen soll, andererseits sind es die Konvertierungen. Ich könnte jetzt noch einige Dinge aufzählen, aber ich will ja eure Geduld nicht überstrapazieren, daher EIN;) konkretes Problem:</p>
<p>Ich habe eine Funktion mit einem string Parameter. Wenn ich diesen Parameter in der Funktion in einen const char* mittel c_str() umwandle enthälte er nur das erste Zeichen. Wenn ich aber in der Funktion dem Parameter einen Wert zuweise funktioniert es.</p>
<p>Ich glaube mit Code ist es ein wenig verständlicher:</p>
<pre><code>void foo(string input)
{
   cout &lt;&lt; input &lt;&lt; endl;   // String ist gefuellt

   const char* bar = input.c_str();

   cout &lt;&lt; bar &lt;&lt; endl;      // Nur das 1.Zeichen :( ?!?
}
</code></pre>
<p>Wenn ichs aber so versuche, funktioniert es:</p>
<pre><code>void foo(string input)
{
   input = &quot;blablab&quot;;

   const char* bar = input.c_str();

   cout &lt;&lt; bar &lt;&lt; endl;      // String ist gefüllt
}
</code></pre>
<p>Hat das was mit CallbyValue und CallbyReference zu tun? Bzw. wie bringe ich die erste Version zum Laufen?</p>
<p>Bitte helft mir :)!</p>
<p>mfg,<br />
soad</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255614</guid><dc:creator><![CDATA[soad]]></dc:creator><pubDate>Thu, 29 Mar 2007 22:42:39 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Thu, 29 Mar 2007 20:23:00 GMT]]></title><description><![CDATA[<p>Du bist hier im C++/CLI-Forum, da sollte dir eigentlich die String-Klasse aus dem .NET-Framework zur Verfügung stehen.</p>
<p>Wenn du hier nur fälschlicherweise gelandet bist und eigetnlich nach C++ wolltest folgende Antwort: Verwende einfach immer und überall std::string am Beginn - kann alles, du verwendest es ganz normal und fertig <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>Nein, dass der leer ist kann ich jetzt nicht nachvollziehen. Sollte nicht der Fall sein.</p>
<p>Nein, mit Call-By-Value/Call-By-Ref hat das nichts zu tun. Du verwendest hier für die string-Übergabe zwar tatsächlich ein sehr langsames und unnötiges Call-By-Value, allerdings hat std::string einen ordentlichen Kopierkonstruktor (Begriff wirst du später erlernen) und das funktioniert.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255616</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Thu, 29 Mar 2007 20:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Thu, 29 Mar 2007 20:41:00 GMT]]></title><description><![CDATA[<p>Ups, bin wirklich im falschen Forum <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>
<p>Wie gesagt, kämpfe noch ziemlich mit strings und char* und weiß nicht genau, wann man was verwenden soll, aber sag mir bitte, warum das unnötig und langsam ist. Wie macht man es richtig?</p>
<p>mfg,<br />
soad</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255625</guid><dc:creator><![CDATA[soad]]></dc:creator><pubDate>Thu, 29 Mar 2007 20:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Thu, 29 Mar 2007 20:49:16 GMT]]></title><description><![CDATA[<p>Wenn du einen String via Call-By-Value, also via:</p>
<pre><code class="language-cpp">void func (std::string str)
{
}
</code></pre>
<p>übergibst, wird der komplette Originalstring in den neuen String &quot;str&quot; kopiert (und das dauert). Besser bei größeren Objekten also Call-By-Ref verwenden:</p>
<pre><code class="language-cpp">void func (std::string&amp; str)
{
}
</code></pre>
<p>Jetzt wird der String nicht mehr kopiert. Er bekommt nur innerhalb von func() den neuen Aliasnamen &quot;str&quot;. Allerdings würden sich jetzt auch alle Änderungen auf den Original-String auswirken - wird ja nicht mit einer Kopie gearbeitet. Um das zu verhindern kann man Änderungen verbieten:</p>
<pre><code class="language-cpp">void func (const std::string&amp; str)
{
}
</code></pre>
<p>Dank std::string benötigst du als Anfänger erstmal gar kein Wissen rund um char*, etc. Dir wird dann im Kapitel über Arrays ein Lichtlein aufgehen was ein String in C früher war und immer noch sein kann - nichts mehr als ein Array von Zeichen.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255630</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Thu, 29 Mar 2007 20:49:16 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Thu, 29 Mar 2007 21:07:00 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-18363.html" rel="nofollow">Jochen Kalmbach</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-58.html" rel="nofollow">C++/CLI mit .NET</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255644</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Thu, 29 Mar 2007 21:07:00 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Thu, 29 Mar 2007 22:46:40 GMT]]></title><description><![CDATA[<p>ok, danke!</p>
<p>Zu meinem &quot;Problem&quot;: der char* ist nicht leer, sondern enthält nur das erste Zeichen.</p>
<p>Einen String übergebe ich eigentlich nur, weil ich zeilenweise mittels getline() einlese, oder könnte man das auch mit char* einfach lösen?</p>
<p>mfg,<br />
soad</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255676</guid><dc:creator><![CDATA[soad]]></dc:creator><pubDate>Thu, 29 Mar 2007 22:46:40 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Fri, 30 Mar 2007 06:43:40 GMT]]></title><description><![CDATA[<p>soad schrieb:</p>
<blockquote>
<p>...könnte man das auch mit char* einfach lösen?</p>
<p>mfg,<br />
soad</p>
</blockquote>
<p>lösen: Ja<br />
einfach: Nein</p>
<p>Einfacheres als string findest Du nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1255749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1255749</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 30 Mar 2007 06:43:40 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Sun, 01 Apr 2007 11:55:04 GMT]]></title><description><![CDATA[<pre><code>void foo(string input)
{
   cout &lt;&lt; input &lt;&lt; endl;   // String ist gefuellt

   const char* bar = input.c_str();

   cout &lt;&lt; bar &lt;&lt; endl;      // Nur das 1.Zeichen :( ?!?
}
</code></pre>
<p>es hat bi mir funktioniert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1257107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1257107</guid><dc:creator><![CDATA[netrobot]]></dc:creator><pubDate>Sun, 01 Apr 2007 11:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Sun, 01 Apr 2007 12:13:39 GMT]]></title><description><![CDATA[<p>const char* gewinnt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1257129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1257129</guid><dc:creator><![CDATA[Ringrichter]]></dc:creator><pubDate>Sun, 01 Apr 2007 12:13:39 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Sun, 01 Apr 2007 12:26:02 GMT]]></title><description><![CDATA[<p>So da sich kein anderer erbarmt hir Mal die Lösung für dein Problem. Ich hatte ein ähnliches, wodurch ich in diesem Fall Abstand von c_str() genommen habe:</p>
<pre><code class="language-cpp">void foo(std::string cInput)
{
    std::cout &lt;&lt;cInput&lt;&lt;&quot; dies ist der \&quot;string\&quot;&lt;&lt;&quot;\n&quot;;
    char *cBuffer=new char[cInput.length()];
    strcpy(cBuffer,cInput.c_str());
    std::cout &lt;&lt;cBuffer&lt;&lt;&quot; dies ist der \&quot;char*\&quot;&lt;&lt;&quot;\n&quot;;
}
</code></pre>
<p>Müsste eigentlich soweit funktionieren. Probier es aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1257142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1257142</guid><dc:creator><![CDATA[Kevinus]]></dc:creator><pubDate>Sun, 01 Apr 2007 12:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Sun, 01 Apr 2007 13:48:12 GMT]]></title><description><![CDATA[<p>netrobot schrieb:</p>
<blockquote>
<pre><code>void foo(string input)
{
   cout &lt;&lt; input &lt;&lt; endl;   // String ist gefuellt
   
   const char* bar = input.c_str();
		
   cout &lt;&lt; bar &lt;&lt; endl;      // Nur das 1.Zeichen :( ?!?
}
</code></pre>
<p>es hat bi mir funktioniert</p>
</blockquote>
<p>Das Problem war, dass ich zuvor noch strtok() verwendet habe, ganz nachvollziehen kann ich es zwar noch nicht, aber ich hab es jetzt zumindestens (etwas unschön) gelöst ;).</p>
<p>Kevinus schrieb:</p>
<blockquote>
<p>So da sich kein anderer erbarmt hir Mal die Lösung für dein Problem. Ich hatte ein ähnliches, wodurch ich in diesem Fall Abstand von c_str() genommen habe:</p>
<pre><code class="language-cpp">void foo(std::string cInput)
{
    std::cout &lt;&lt;cInput&lt;&lt;&quot; dies ist der \&quot;string\&quot;&lt;&lt;&quot;\n&quot;;
    char *cBuffer=new char[cInput.length()];
    strcpy(cBuffer,cInput.c_str());
    std::cout &lt;&lt;cBuffer&lt;&lt;&quot; dies ist der \&quot;char*\&quot;&lt;&lt;&quot;\n&quot;;
}
</code></pre>
<p>Müsste eigentlich soweit funktionieren. Probier es aus.</p>
</blockquote>
<p>Danke, schaut eigentlich jetzt eh nicht so kompliziert aus und es funkt <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="👍"
    />!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1257233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1257233</guid><dc:creator><![CDATA[soad]]></dc:creator><pubDate>Sun, 01 Apr 2007 13:48:12 GMT</pubDate></item><item><title><![CDATA[Reply to String vs. char* vs. const char* on Sun, 01 Apr 2007 21:16:50 GMT]]></title><description><![CDATA[<p>soad schrieb:</p>
<blockquote>
<p>netrobot schrieb:</p>
<blockquote>
<pre><code>void foo(string input)
{
   cout &lt;&lt; input &lt;&lt; endl;   // String ist gefuellt
   
   const char* bar = input.c_str();
		
   cout &lt;&lt; bar &lt;&lt; endl;      // Nur das 1.Zeichen :( ?!?
}
</code></pre>
<p>es hat bi mir funktioniert</p>
</blockquote>
<p>Das Problem war, dass ich zuvor noch strtok() verwendet habe, ganz nachvollziehen kann ich es zwar noch nicht, ...</p>
</blockquote>
<p>Das mit dem strtok() ist die wesentliche Information dabei.<br />
Gemäß Schnittstelle garantiert sttok() nicht, dass es nicht doch versucht, den String, den es &quot;tokenized&quot; zu verändern.<br />
c_str() garantiert aber nur das erwartete ergebnis, solange der String unverändert bleibt ... deswegen gibt er auch einen const char* zurück (und nicht einen char* ).<br />
Der von Kevinus gezeigte Weg ist kein &quot;Hack&quot;, sondern der kanonische Weg, zwischen einem String und einem veränderbaren char-Buffer zu vermitteln: Kopieren eben.<br />
(Allerdings ht er einen kleinen aber typischen Fehler drin - derseleb unterläuft mir auch immer:</p>
<p>Kevinus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
    char *cBuffer=new char[cInput.length()+1]; // Ein Zeichen für &quot;Nullbyte&quot;
</code></pre>
<p>...</p>
</blockquote>
<p>Außerdem sollte der Speicher mit delete[] nach Gebrauch wieder freigegeben werden - die new/copy/delete-Kiste ist ein gutes Beispiel dafür, warum man besser string in seinen SChnittstellen verwenden sollte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> )</p>
<p>Ist nicht besonders erstaunlich eigentlich, weil auch niemand auf die Idee käme, andere Typen würden eine &quot;kopiefreie Konvertierung&quot; überleben:</p>
<pre><code class="language-cpp">void quadriere(int*);

int main() {
   char s[] = &quot;123&quot;;
   quadriere((int*) s); // wer erwartet, dass das klappt ?
...
</code></pre>
<p>Ebensowenig ist das mit string-&gt;char* erstaunlich - es ist eher erstaunlich, dass es überhaupt bei einigen wenigen Typen funktioniert (ich wäre aber immer sehr skeptisch, ob das gutes Design ist).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1257658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1257658</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sun, 01 Apr 2007 21:16:50 GMT</pubDate></item></channel></rss>