<?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[CString kopieren, Verkrüppelte Kopie]]></title><description><![CDATA[<p>Habe hier eine Funktion geschrieben, die eine Kopie von einem string zurückgibt bzw den string kopiert und den pointer auf den stringbeginn der Kopie zurückgibt.</p>
<p>Der pointer auf das erste Zeichen des Quellstrings wird als Parameter der Funktion übergeben.</p>
<p>Innerhalb dieser Funktion wird ein char array der Länge des übergebenen strings erzeugt. Anders formuliert: Es wird ein pointer auf eine Adresse erstellt, ab der strlen(source)+1 chars passen würden, ohne etwas anderes auf der RAM zu überschreiben.</p>
<p>Nun lasse ich jedes einzelne Zeichen vom Quellstring auf die Adressen des Zielstrings kopieren, den pointer auf das erste Zeichen des Ziels zurückgeben und beides ausgeben.</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

char* strcpy(char* source)
{
	// Adressenstrang für die chars der Kopie belegen
	char target[strlen(source)+1];

	// Kopie auf den gewählten Adressbereich ablegen
	char* target_i = target;
	while (*target_i++ = *source++);

	// pointer auf den Beginn der Kopie zurückgeben
	return target;
}

int main(int argc, char *argv[])
{
	char* str = &quot;hallo&quot;;
	char* cpy = strcpy(str);

	cout &lt;&lt; str &lt;&lt; endl;
	cout &lt;&lt; cpy &lt;&lt; endl;

    system(&quot;PAUSE&quot;);
    return 0;
}
</code></pre>
<p>Und das kommt komischerweise bei raus o_O</p>
<blockquote>
<p>hallo<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/263a.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face"
      title=":smiling_face:"
      alt="☺"
    />&amp;@<br />
Drücken Sie eine beliebige Taste . . .</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/topic/208499/cstring-kopieren-verkrüppelte-kopie</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 19:37:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208499.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Mar 2008 06:49:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 06:53:36 GMT]]></title><description><![CDATA[<p>Habe hier eine Funktion geschrieben, die eine Kopie von einem string zurückgibt bzw den string kopiert und den pointer auf den stringbeginn der Kopie zurückgibt.</p>
<p>Der pointer auf das erste Zeichen des Quellstrings wird als Parameter der Funktion übergeben.</p>
<p>Innerhalb dieser Funktion wird ein char array der Länge des übergebenen strings erzeugt. Anders formuliert: Es wird ein pointer auf eine Adresse erstellt, ab der strlen(source)+1 chars passen würden, ohne etwas anderes auf der RAM zu überschreiben.</p>
<p>Nun lasse ich jedes einzelne Zeichen vom Quellstring auf die Adressen des Zielstrings kopieren, den pointer auf das erste Zeichen des Ziels zurückgeben und beides ausgeben.</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

char* strcpy(char* source)
{
	// Adressenstrang für die chars der Kopie belegen
	char target[strlen(source)+1];

	// Kopie auf den gewählten Adressbereich ablegen
	char* target_i = target;
	while (*target_i++ = *source++);

	// pointer auf den Beginn der Kopie zurückgeben
	return target;
}

int main(int argc, char *argv[])
{
	char* str = &quot;hallo&quot;;
	char* cpy = strcpy(str);

	cout &lt;&lt; str &lt;&lt; endl;
	cout &lt;&lt; cpy &lt;&lt; endl;

    system(&quot;PAUSE&quot;);
    return 0;
}
</code></pre>
<p>Und das kommt komischerweise bei raus o_O</p>
<blockquote>
<p>hallo<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/263a.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face"
      title=":smiling_face:"
      alt="☺"
    />&amp;@<br />
Drücken Sie eine beliebige Taste . . .</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1477007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477007</guid><dc:creator><![CDATA[sjBlack]]></dc:creator><pubDate>Wed, 19 Mar 2008 06:53:36 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 06:53:21 GMT]]></title><description><![CDATA[<p>hmm...mal ne frage so nebenbei, warum benutzt du nicht die standard kopier funktion die dir schon bereitgestellt wird, und warum nimmst du nicht den std::string??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477011</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Wed, 19 Mar 2008 06:53:21 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 07:00:33 GMT]]></title><description><![CDATA[<p>Weil ich in meinen 500 Seiten dicken C++ Buch nochmal eingelesen habe und das Kapitel &quot;Intermezzo: Zeiger, Arrays, dynamische Datenobjekte&quot; nochmal durchnehme.</p>
<p>Mit diesem geposteten Stück Code wollte ich testen, ob ich das jetzt ein für alle Mal gerafft habe.</p>
<p>Zum Beispiel, dass der Blockoperator bei der Inizialisierung dafür sorgt, dass eine Adresse gewählt wird, ab der i Variablen des selben Datentyps reinpassen, ohne was vorhandenes zu überschreiben, wobei i die Zahl innerhalb des Blockoperators ist.</p>
<p>Und scheinbar ist es wohl doch nicht so bei dem Gemetzel, das ich hier ausgegeben bekomme. Und nun wollte ich wissen, woran das liegt und wie ich das jetzt hinbekomme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477013</guid><dc:creator><![CDATA[sjBlack]]></dc:creator><pubDate>Wed, 19 Mar 2008 07:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 07:03:35 GMT]]></title><description><![CDATA[<p>1. Die Funktion ist zum Zeitpunkt der Ausgabe doch durchgelaufen. Das heißt, die Variablen der Funktion existieren nicht mehr. Du hast also einen Zeiger auf eine nicht existierende Variable.<br />
2. Arrays variabler Länge (strlen(source)+1 als Länge für target) gibt es in C++ nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477015</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 19 Mar 2008 07:03:35 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 07:17:12 GMT]]></title><description><![CDATA[<p>Au ***, stimmt ja. Muss ich schon mit new auf dem heap erzeugen, wegen der Gültigkeit. thx</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>2. Arrays variabler Länge (strlen(source)+1 als Länge für target) gibt es in C++ nicht.</p>
</blockquote>
<p>doch, das hat mir mein oben erwähntes 500 Seiten-Buch bewiesen. &quot;C++ - Einführung und profesionelle Programmierung&quot; von Ulrich Breymann (entspricht dem internationalen C++-Standard ISO/IEC 14882) Hanser Verlag</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477020</guid><dc:creator><![CDATA[sjBlack]]></dc:creator><pubDate>Wed, 19 Mar 2008 07:17:12 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 07:25:11 GMT]]></title><description><![CDATA[<p>sjBlack schrieb:</p>
<blockquote>
<p>doch, das hat mir mein oben erwähntes 500 Seiten-Buch bewiesen. &quot;C++ - Einführung und profesionelle Programmierung&quot; von Ulrich Breymann (entspricht dem internationalen C++-Standard ISO/IEC 14882) Hanser Verlag</p>
</blockquote>
<p>Die Beweisführung des Buches würde mich interessieren. Letztendlich kann es nur ein Standardauszug mit Ortsangabe sein, der mich überzeugt...</p>
<p>Nein, in ISO/IEC 14882:2003 gibt es wirklich keine variable-length Arrays. In C99 (ISO/IEC 9899:1999) gibt es die allerdings schon. Aber das hat nichts mehr mit C++ zu tun <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1477024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477024</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 19 Mar 2008 07:25:11 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 07:48:59 GMT]]></title><description><![CDATA[<p>Dann wäre ja keine String-Klasse möglich, bei der die Adressbelegung springt, wenn es bei der Zuweisung eines größeren Strings nötig wäre!? Ich habe jetzt zum Beispiel cstring eingebunden via #include&lt;cstring&gt;</p>
<p>und der compiler bietet mir folgende Formalparameterlisten und Rückgaben<br />
<a href="http://img214.imageshack.us/my.php?image=lolfh1.png" rel="nofollow">http://img214.imageshack.us/my.php?image=lolfh1.png</a></p>
<p>Wie soll das dann möglich sein, wenn variable Arraygröße nicht möäglich ist? Das Ding würd ja andere Variablen einfach mal kreuz und quer überschreiben!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477032</guid><dc:creator><![CDATA[sjBlack]]></dc:creator><pubDate>Wed, 19 Mar 2008 07:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 07:48:07 GMT]]></title><description><![CDATA[<p>sjBlack schrieb:</p>
<blockquote>
<p>Dann wäre ja keine String-Klasse möglich, bei der die Adressbelegung springt, wenn es bei der Zuweisung eines größeren Strings nötig wäre!? Ich habe jetzt zum Beispiel cstring eingebunden via #include&lt;cstring&gt;</p>
<p>und der compiler bietet mir folgende Formalparameterlisten und Rückgaben<br />
<a href="http://img214.imageshack.us/my.php?image=lolfh1.png" rel="nofollow">http://img214.imageshack.us/my.php?image=lolfh1.png</a></p>
<p>Wie soll das dann möglich sein, wenn variable Arraygröße nicht möäglich ist?</p>
</blockquote>
<p>sicher, das ist dann aber kein stackarray wie du es angelegt hast, sondern ein mit new erstelltes. himmelweiter unterschied.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477034</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 19 Mar 2008 07:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 07:52:11 GMT]]></title><description><![CDATA[<p>Auf dem heap ist es also erlaubt? Ich erkenne irgendwie keinen großen Unterschied. Nur dass man Werte auf dem heap mit delete löschen kann. Sonst ist auch kein besonderes Unterschied erläutert. Im Buch steht einfach, das wär jetz dynamisch und das wars. Inwiefern is' es denn jetzt dynamisch!? Naja, das springt jetzt aber komplett aus dem topic title.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477037</guid><dc:creator><![CDATA[sjBlack]]></dc:creator><pubDate>Wed, 19 Mar 2008 07:52:11 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 07:54:03 GMT]]></title><description><![CDATA[<p>Du hast den Unterschied selbst bereits erläutert: Das Array auf dem Stack lebt nach dem Rücksprung aus der Funktion nicht mehr, deshalb musst Du es mit new anlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477038</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 19 Mar 2008 07:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 08:03:19 GMT]]></title><description><![CDATA[<p>Also ist die Lebensdauer und delete der einzige Unterschied?<br />
Die Aussage &quot;Der heap ist ein Bereich auf dem Arbeitsspeicher&quot; wäre korrekter &quot;Mit new erzeugte Variablen gelten als dynamische Datenobjekte&quot;? Und dynamisches Datenobjekt bedeutet auch nichts anderes als diese Lebensdauer + delete Operator?</p>
<p>Noch ein paar Fragen -&gt; Ein bisschen Ethik:<br />
Eine Variable ist eigentlich das, was beim Ansprechen direkt den Wert holt, auf den sie gerichtet ist. Der Wurzelpointer sozusagen. Variable = root pointer<br />
So bewirkt der Adressoperator &amp;, dass die Variable nicht den Wert auf der Adresse holt, auf die sie gerichtet ist und diesen zurückgibt, sondern einfach nur die Adresse, auf die sie zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477040</guid><dc:creator><![CDATA[sjBlack]]></dc:creator><pubDate>Wed, 19 Mar 2008 08:03:19 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 08:14:45 GMT]]></title><description><![CDATA[<p>sjBlack schrieb:</p>
<blockquote>
<p>Also ist die Lebensdauer und delete der einzige Unterschied?...</p>
</blockquote>
<p>UND die Größenbestimmung zur Laufzeit !</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477048</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 19 Mar 2008 08:14:45 GMT</pubDate></item><item><title><![CDATA[Reply to CString kopieren, Verkrüppelte Kopie on Wed, 19 Mar 2008 08:26:18 GMT]]></title><description><![CDATA[<p>sjBlack schrieb:</p>
<blockquote>
<p>Noch ein paar Fragen -&gt; Ein bisschen Ethik:<br />
Eine Variable ist eigentlich das, was beim Ansprechen direkt den Wert holt, auf den sie gerichtet ist. Der Wurzelpointer sozusagen. Variable = root pointer<br />
So bewirkt der Adressoperator &amp;, dass die Variable nicht den Wert auf der Adresse holt, auf die sie gerichtet ist und diesen zurückgibt, sondern einfach nur die Adresse, auf die sie zeigt.</p>
</blockquote>
<p>nicht ganz; eine variable ist kein zeiger. aber der <em>name</em> der variable verweist auf ein objekt im speicher. (ein objekt im C++-sinn ist ein bestimmter bereich im speicher) zur laufzeit gibt es diese namen nicht mehr, sehr wohl aber die objekte. so bekommst du über den adressoperator zur laufzeit eben die adresse des jeweiligen objekts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477054</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Wed, 19 Mar 2008 08:26:18 GMT</pubDate></item></channel></rss>