<?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[char nervt mich langsam echt (chars kopieren und so)]]></title><description><![CDATA[<p>hallo,</p>
<p>ich verzweifel bald mit den chars<br />
ich möchte eine methode schreiben, die ein Objekt meiner Stirngklasse zurückgibt, und darin ein SubString enthalten ist...</p>
<p>hier mein versuch, einen substirng aus einem char zu holen, vergebens:</p>
<pre><code class="language-cpp">MyString MyString::SubString(int pos,int n)
{
 char* temp = new char[n+1];
 int posi=0;
 int counter = 0;
 for(int i=pos;i&lt;n;i++)
 {
 temp[posi]=m_text[i];
 posi++;
 counter++;
 }
 MyString t(temp);

 delete[] temp;
 return t;

}
</code></pre>
<p>ausser das er mit ner zugriffsverletzung abbricht, ist der substring auch nicht der, der er sein soll...es sind dauernt noch lustige zeichen mit drin!</p>
<p>kann mir bitte einer mal genau erklären wie ich sowas mit chars chararrays und so mache?</p>
<p>ich WILL kein string verwenden....</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/138778/char-nervt-mich-langsam-echt-chars-kopieren-und-so</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 06:10:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/138778.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Mar 2006 10:45:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to char nervt mich langsam echt (chars kopieren und so) on Wed, 01 Mar 2006 10:45:38 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>ich verzweifel bald mit den chars<br />
ich möchte eine methode schreiben, die ein Objekt meiner Stirngklasse zurückgibt, und darin ein SubString enthalten ist...</p>
<p>hier mein versuch, einen substirng aus einem char zu holen, vergebens:</p>
<pre><code class="language-cpp">MyString MyString::SubString(int pos,int n)
{
 char* temp = new char[n+1];
 int posi=0;
 int counter = 0;
 for(int i=pos;i&lt;n;i++)
 {
 temp[posi]=m_text[i];
 posi++;
 counter++;
 }
 MyString t(temp);

 delete[] temp;
 return t;

}
</code></pre>
<p>ausser das er mit ner zugriffsverletzung abbricht, ist der substring auch nicht der, der er sein soll...es sind dauernt noch lustige zeichen mit drin!</p>
<p>kann mir bitte einer mal genau erklären wie ich sowas mit chars chararrays und so mache?</p>
<p>ich WILL kein string verwenden....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1005767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1005767</guid><dc:creator><![CDATA[asdasd]]></dc:creator><pubDate>Wed, 01 Mar 2006 10:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to char nervt mich langsam echt (chars kopieren und so) on Wed, 01 Mar 2006 10:55:44 GMT]]></title><description><![CDATA[<p>Die Schleifenbedingung scheint nicht zu stimmen, statt i &lt; n würde ich eher posi &lt; n erwarten, n ist ja die Länge des Substrings und nicht die Endposition.</p>
<p>Und machst du im Konstruktor eine tiefe Kopie oder übernimmst du einfach den übergebenen Zeiger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1005780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1005780</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 01 Mar 2006 10:55:44 GMT</pubDate></item><item><title><![CDATA[Reply to char nervt mich langsam echt (chars kopieren und so) on Wed, 01 Mar 2006 11:20:29 GMT]]></title><description><![CDATA[<p>also mein copy ctor sieht so aus:</p>
<pre><code class="language-cpp">MyString::MyString(const MyString&amp; Obj)
{
	int copysize = strlen(Obj.m_text)+1;
	this-&gt;m_buffersize = Obj.m_buffersize;
	m_text = new char[m_buffersize];
	strncpy(m_text,Obj.m_text,copysize);
	StringLeng = strlen(m_text);
}
</code></pre>
<p>schleife hab ich angepasst</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1005792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1005792</guid><dc:creator><![CDATA[asdasd]]></dc:creator><pubDate>Wed, 01 Mar 2006 11:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to char nervt mich langsam echt (chars kopieren und so) on Wed, 01 Mar 2006 11:38:08 GMT]]></title><description><![CDATA[<p>Und noch ein Punkt: Wenn du mit strlen() und Co. arbeitest, sind die '\0' am String-Ende enorm wichtig - andernfalls wird der String mit den Daten fortgesetzt, die hinter deinem char-Array gerade im Speicher stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1005808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1005808</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 01 Mar 2006 11:38:08 GMT</pubDate></item><item><title><![CDATA[Reply to char nervt mich langsam echt (chars kopieren und so) on Wed, 01 Mar 2006 11:39:02 GMT]]></title><description><![CDATA[<p>MyString t(temp) ruft aber den Construktor der ([const] char <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="😉"
    /> erwartet auf, von daher nutzt uns der Copy Constructor nix <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>Ich würde meinen am Ende der Schleife fehlt ein temp[posi]='\0' (ein Zeichen für das Nullbyte reservierst Du ja oben sogar).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1005810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1005810</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 01 Mar 2006 11:39:02 GMT</pubDate></item><item><title><![CDATA[Reply to char nervt mich langsam echt (chars kopieren und so) on Wed, 01 Mar 2006 11:42:53 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>MyString t(temp) ruft aber den Construktor der ([const] char <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="😉"
    /> erwartet auf, von daher nutzt uns der Copy Constructor nix <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>Ich würde meinen am Ende der Schleife fehlt ein temp[posi]='\0' (ein Zeichen für das Nullbyte reservierst Du ja oben sogar).</p>
</blockquote>
<p>sorry</p>
<p>den hab ich natürlich auch:</p>
<pre><code class="language-cpp">MyString::MyString(const char* text,unsigned int buffersize=20)
{
	int copysize = strlen(text)+1;
	if(strlen(text)&gt;=buffersize)
	  buffersize+=BUFFER;
	m_buffersize = buffersize;
	 m_text = new char[buffersize];
	 strncpy(m_text,text,copysize);
	 StringLeng = strlen(m_text);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1005813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1005813</guid><dc:creator><![CDATA[asdasd]]></dc:creator><pubDate>Wed, 01 Mar 2006 11:42:53 GMT</pubDate></item><item><title><![CDATA[Reply to char nervt mich langsam echt (chars kopieren und so) on Wed, 01 Mar 2006 11:46:54 GMT]]></title><description><![CDATA[<p>Weiß nicht ob es dir hilft, aber ich kann dir mal meine Realisierung geben. Allerdings habe ich die Zielklasse als Parameter, da ich unkontrollierte Objekterzeugungen nicht so mag - kannst du ja abändern.</p>
<pre><code class="language-cpp">void CString::GetString
  (CString&amp; xTarget, uint32 uStartPos, uint32 uCharCount) const
{
  FX_ASSERT(&amp;xTarget != this);

  if (!uCharCount || uStartPos &gt;= this-&gt;GetLength())
  {
    xTarget.Reset();
    return;
  }

  if (uStartPos + uCharCount &gt; this-&gt;GetLength())
    uCharCount = this-&gt;GetLength() - uStartPos;

  xTarget.SetLength (uCharCount);
  memcpy (xTarget.cString, &amp;this-&gt;cString[uStartPos], uCharCount);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1005821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1005821</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Wed, 01 Mar 2006 11:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to char nervt mich langsam echt (chars kopieren und so) on Wed, 01 Mar 2006 11:57:35 GMT]]></title><description><![CDATA[<p>asdasd schrieb:</p>
<blockquote>
<p>sorry</p>
<p>den hab ich natürlich auch:</p>
<pre><code class="language-cpp">...
</code></pre>
</blockquote>
<p>Wie erwartet - der nutzt auch strlen() für die Längenbestimmung und läuft deshalb vermutlich über's Ziel hinaus.</p>
<p>Mal ausführlich: strlen() zählt einfach nur die Zeichen, bis es auf ein '\0' stößt. Deine temp-Zeichenkette hat selber kein abschließendes '\0', deshalb zählst du über das Ende des von dir reservierten Bereiches hinaus, bis du zufällig auf eine 0 im Speicher stößt - und diese ganzen Mülldaten werden später noch &quot;offiziell&quot; gemacht, indem du sie in deinen String reinkopierst.<br />
(wenn du Glück hast, schaffst du es bis zum Systembereich und dann kollabiert das Programm mit einem SegFault :D)</p>
<p>Wie du das Problem lösen kannst, hat LordJaxom schon angedeutet:</p>
<pre><code class="language-cpp">MyString MyString::SubString(int pos,int n)
{
  char* temp = new char[n+1];
  int posi=0;
  int counter = 0;
  for(int i=pos;i&lt;n;i++)
  {
    temp[posi]=m_text[i];
    posi++;
    counter++;
  }
  //ganz wichtig:
  temp[posi]='\0';

  MyString t(temp);

  delete[] temp;
  return t;
}
</code></pre>
<p>(und eventuell könntest du noch ein &quot;if(m_text[i]=='\0') break;&quot; an den Anfang der Schleife setzen - für den Fall, daß jemand einen zu langen SubString anfordert)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1005828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1005828</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 01 Mar 2006 11:57:35 GMT</pubDate></item><item><title><![CDATA[Reply to char nervt mich langsam echt (chars kopieren und so) on Wed, 01 Mar 2006 14:16:46 GMT]]></title><description><![CDATA[<p>besser wäre, dem Konstructor MyString::MyString(const char*,int) eine sinnvolle implemntierung zu geben. mit der jetzigen version ist der zweite parameter im grunde sinnlos - der zweck sollte ja wohl sein, dass es gerade nicht auf das vorhandensein eines terminators ankommt (im übrigen könnte ein string ja auch eingebette \0 zeichen haben). das bedeutet auch den verzicht auf einen defaultparameter, denselben effekt erreichen wir durch überladung:</p>
<pre><code class="language-cpp">MyString::MyString(const char* s)
: m_buffersize(strlen(s)+1), m_text(new char[m_buffersize])
{
    memcpy(m_text,s,m_buffersize);
}
MyString::MyString(const char* s, int n)
: m_buffersize(n+1), m_text(new char[m_buffersize])
{
    memcpy(m_text,s,n);
    m_text[n]='\0';
}
</code></pre>
<p>dann wird auch SubString sehr einfach und wir vermeiden unnötiges kopieren:</p>
<pre><code class="language-cpp">MyString MyString::SubString(int pos,int n) const
{
    return MyString(m_text+pos,n);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1005962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1005962</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 01 Mar 2006 14:16:46 GMT</pubDate></item></channel></rss>