<?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[Umwandlung Strings und C-Strings]]></title><description><![CDATA[<p>Folgende Funktion habe ich bereits implementiert:</p>
<pre><code class="language-cpp">class klasse {
        ...
        string toStr();
        ...
};

string klasse::toStr() { ... }
</code></pre>
<p>Nun wollte ich die Klasse abwärtskompatibel machen:</p>
<pre><code class="language-cpp">class klasse {
        ...
        string toStr();
        char* toChar();
        ...
};

string klasse::toStr() { ... }
char* klasse::toChar() {
        string ergebnis = toStr();
        return ergebnis.c_str();
}
</code></pre>
<p>Daraufhin aber erhalte ich vom Compiler für die Zeile mit dem Return den freundlichen Hinweis:</p>
<pre><code>invalid conversion from ‘const char*’ to ‘char*’
</code></pre>
<p>Wieso ist das Ergebnis der Funktion toStr() konstant,<br />
und was ist das Problem, es als char* zurückzugeben?</p>
<p>Vielen Dank im Voraus für Eure Hinweise.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285016/umwandlung-strings-und-c-strings</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 08:41:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285016.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Apr 2011 21:56:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Tue, 12 Apr 2011 21:56:59 GMT]]></title><description><![CDATA[<p>Folgende Funktion habe ich bereits implementiert:</p>
<pre><code class="language-cpp">class klasse {
        ...
        string toStr();
        ...
};

string klasse::toStr() { ... }
</code></pre>
<p>Nun wollte ich die Klasse abwärtskompatibel machen:</p>
<pre><code class="language-cpp">class klasse {
        ...
        string toStr();
        char* toChar();
        ...
};

string klasse::toStr() { ... }
char* klasse::toChar() {
        string ergebnis = toStr();
        return ergebnis.c_str();
}
</code></pre>
<p>Daraufhin aber erhalte ich vom Compiler für die Zeile mit dem Return den freundlichen Hinweis:</p>
<pre><code>invalid conversion from ‘const char*’ to ‘char*’
</code></pre>
<p>Wieso ist das Ergebnis der Funktion toStr() konstant,<br />
und was ist das Problem, es als char* zurückzugeben?</p>
<p>Vielen Dank im Voraus für Eure Hinweise.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048407</guid><dc:creator><![CDATA[tollelege]]></dc:creator><pubDate>Tue, 12 Apr 2011 21:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Tue, 12 Apr 2011 22:05:54 GMT]]></title><description><![CDATA[<p>Erstens ist nicht der Rückgabewert deiner toStr() konstant (selbst wenn er es wäre, hätte das keine weitere Bedeutung, weil du sowieso eine Kopie anlegst), sondern der Rückgabewert der std::string::c_str().<br />
Zweitens wirst du mit dem Rückgabewert der toChar()-Methode nicht sehr viel Freude haben - der von c_str() zurückgegebene Speicherbereich wird weiterhin von dem aufgerufenen String kontrolliert und deshalb am Ende der Methode freigegeben, folglich lieferst du nur einen Zeiger auf einen Müllhaufen zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048409</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 12 Apr 2011 22:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 13 Apr 2011 05:09:42 GMT]]></title><description><![CDATA[<p>std::string::c_str() gibt immer einen const char* zurück</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048431</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Wed, 13 Apr 2011 05:09:42 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 13 Apr 2011 05:55:12 GMT]]></title><description><![CDATA[<p>tollelege schrieb:</p>
<blockquote>
<p>Nun wollte ich die Klasse abwärtskompatibel machen:</p>
</blockquote>
<p>Gegenfrage: Warum willst du Funktionen doppelt implementieren, wenn du notfalls das Ergebnis von toStr umwandeln kannst, wenn es wirklich nötig ist (Niemand verbietet ein &quot;.toStr().c_str()&quot;).</p>
<p>Und warum es ein konstanter Zeiger ist, ist bei etwas nachdenken auch klar: Es wird hier kein neues Array angelegt, sondern auf die Stringinterna zurück gegriffen. Sonst müsste man jedesmal wenn man c_str() aufruft, anschließend eine Speicherfreigabe machen.</p>
<p>In 99% der Fälle reicht aber der konstante Zeiger, und wenn nicht, muss man den Inhalt halt umkopieren (In ein passendes Array).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048440</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 13 Apr 2011 05:55:12 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 13 Apr 2011 06:13:58 GMT]]></title><description><![CDATA[<p>Was macht deine Klasse genau? Ein Konvertierungsoperator wäre unter Umständen auch noch sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048444</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 13 Apr 2011 06:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 20 Apr 2011 20:19:46 GMT]]></title><description><![CDATA[<p>Hm, danke soweit für Eure Hinweise.</p>
<p>Ich ahne auch grob, wo das Problem liegt.</p>
<p>Allein, mir fehlt noch wohl</p>
<p>a) das genaue Veständnis der Natur eines konstanten Zeigers (Gegensatz zu seinen variablen Brüdern),</p>
<p>b) die Erkenntnis, was ich hier nun tun kann.</p>
<p>Könnt Ihr mir hier weiterhelfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052236</guid><dc:creator><![CDATA[tollelege]]></dc:creator><pubDate>Wed, 20 Apr 2011 20:19:46 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 20 Apr 2011 20:34:34 GMT]]></title><description><![CDATA[<p>tollelege schrieb:</p>
<blockquote>
<p>a) das genaue Veständnis der Natur eines konstanten Zeigers (Gegensatz zu seinen variablen Brüdern),</p>
</blockquote>
<p>Ein konstanter Zeiger (zumindest in der Form <code>const char* p</code> , die hier relevant ist) kann alles, was auch ein normaler Zeiger kann - außer daß die dahinterliegenden Werte konstant sind.<br />
(daneben gibt es noch die Variante <code>char * const p</code> , da kannst du den Zeiger nach der Initialisierung nicht mehr auf ein neues Ziel umbiegen, und <code>const char * const p</code> , der beides kombiniert)</p>
<blockquote>
<p>b) die Erkenntnis, was ich hier nun tun kann.</p>
</blockquote>
<p>Den std::string kannst du schon übergeben, aber aus einem temporären Objekt die Daten rauszuziehen ist gefährlich. Wenn die toStr()-Methode einen String zurückgibt, der sowieso schon in der Klasse existiert, hätte ich eventuell eine Lösung:</p>
<pre><code class="language-cpp">// Übergabe einer Referenz - sollte natürlich keine lokale Variable aus der Methode zurückgeben
const string&amp; toStr() const;
const char* toChar() const
{
  return toStr().c_str()
}
</code></pre>
<p>In anderen Fällen solltest du dich auf die toStr()-Methode beschränken und bei Bedarf direkt daraus das char-Array extrahieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052243</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 20 Apr 2011 20:34:34 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 20 Apr 2011 20:36:38 GMT]]></title><description><![CDATA[<p>Achso, vielleicht sollte ich das erwähnen:</p>
<p>Den Rückgabewert als C-String, also als *char, brauche ich, um einen Filestream zu füttern; mit anderen Worten: Ich möchte eine Schnittstelle basteln, wie ich eine Instanz meiner Klasse mit ein paar Texteinträgen in einer Datei codieren kann.</p>
<p>Die gedankliche Arbeit, welche Daten für die Klasse gespeichert werden müssen, steckt in der Funktion toStr().</p>
<p>Letztendlich wollte ich auf</p>
<pre><code class="language-cpp">fstream schreiberling(dateiname.c_str(), ios::out);
schreiberling &lt;&lt; instanz.toChar();
</code></pre>
<p>Vielleicht ist das anders besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052244</guid><dc:creator><![CDATA[tollelege]]></dc:creator><pubDate>Wed, 20 Apr 2011 20:36:38 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 20 Apr 2011 21:03:14 GMT]]></title><description><![CDATA[<p>Warum überlädst du nicht gleich den Stream-Operator? Außerdem kann man einen std::string problemlos in eine File schreiben, da braucht man kein .c_str().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052260</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 20 Apr 2011 21:03:14 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 20 Apr 2011 21:17:09 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Warum überlädst du nicht gleich den Stream-Operator?</p>
</blockquote>
<p>Du meinst, den Operator fstream::operator&lt;&lt;(char* zeichenkette) ?</p>
<p>Also sollte ich einen fstream::operator&lt;&lt;(klasse instanz) schreiben?</p>
<p>Naja, dazu müsste ich ja eine spezielle Klasse &quot;klstream&quot; von fstream ableiten, und das scheint mir dann doch etwas umständlich ...</p>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Außerdem kann man einen std::string problemlos in eine File schreiben, da braucht man kein .c_str().</p>
</blockquote>
<p><strong>Ja, und wie geht das?</strong></p>
<p>Bisher habe ich bei der Suche immer nur die alten Stream-C-String-Geschichten gehört. Das würde mich sehr interessieren!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052270</guid><dc:creator><![CDATA[tollelege]]></dc:creator><pubDate>Wed, 20 Apr 2011 21:17:09 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 20 Apr 2011 21:30:24 GMT]]></title><description><![CDATA[<p><a href="http://ideone.com/Uv8Vx" rel="nofollow">http://ideone.com/Uv8Vx</a><br />
Wo liegt das Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052277</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 20 Apr 2011 21:30:24 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Wed, 20 Apr 2011 21:37:00 GMT]]></title><description><![CDATA[<p>tollelege schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Warum überlädst du nicht gleich den Stream-Operator?</p>
</blockquote>
<p>Du meinst, den Operator fstream::operator&lt;&lt;(char* zeichenkette) ?</p>
<p>Also sollte ich einen fstream::operator&lt;&lt;(klasse instanz) schreiben?</p>
<p>Naja, dazu müsste ich ja eine spezielle Klasse &quot;klstream&quot; von fstream ableiten, und das scheint mir dann doch etwas umständlich ...</p>
</blockquote>
<p>Nein, du mußt keine eigene Stream-Klasse dafür überladen, der Kollege Pi wollte eher auf eine globale Operator-Überladung hinweisen:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; out, const meineKlasse&amp; data)
{
  //alle wichtigen Inhalte schreiben, oder
  out &lt;&lt; data.toStr();
  return out;
}
</code></pre>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Außerdem kann man einen std::string problemlos in eine File schreiben, da braucht man kein .c_str().</p>
</blockquote>
<p><strong>Ja, und wie geht das?</strong></p>
<p>Bisher habe ich bei der Suche immer nur die alten Stream-C-String-Geschichten gehört. Das würde mich sehr interessieren!</p>
</blockquote>
<p>Es gibt auch eine Überladung des Ausgabe-Operators für std::string - und zur Not kannst du für deine Klassen eigene schreiben (s.o.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052281</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 20 Apr 2011 21:37:00 GMT</pubDate></item><item><title><![CDATA[Reply to Umwandlung Strings und C-Strings on Fri, 29 Apr 2011 20:41:25 GMT]]></title><description><![CDATA[<p>OK, das erleichtert natürlich einiges. Vielen Dank ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056287</guid><dc:creator><![CDATA[tollelege]]></dc:creator><pubDate>Fri, 29 Apr 2011 20:41:25 GMT</pubDate></item></channel></rss>