<?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[Frage zu C-String]]></title><description><![CDATA[<p>Hallo wie kann ich an einen C-String einen weiteren anfügen?</p>
<p>Hier ein Beispiel was ich meine:</p>
<pre><code class="language-cpp">char *ChrName = &quot;Name: &quot;;
char *ChrmyName = &quot;abc&quot;;

In C++ würde ich das so machen oder halt mit der Funktion append
string StrName = &quot;Name: &quot;;
string myName = &quot;abc&quot;;
StrName+=myName;
</code></pre>
<p>In meinem Fall kann ich keinen std::string verwenden weil Binär Daten versendet werden müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306572/frage-zu-c-string</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 16:40:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306572.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Aug 2012 14:19:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 14:19:10 GMT]]></title><description><![CDATA[<p>Hallo wie kann ich an einen C-String einen weiteren anfügen?</p>
<p>Hier ein Beispiel was ich meine:</p>
<pre><code class="language-cpp">char *ChrName = &quot;Name: &quot;;
char *ChrmyName = &quot;abc&quot;;

In C++ würde ich das so machen oder halt mit der Funktion append
string StrName = &quot;Name: &quot;;
string myName = &quot;abc&quot;;
StrName+=myName;
</code></pre>
<p>In meinem Fall kann ich keinen std::string verwenden weil Binär Daten versendet werden müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237654</guid><dc:creator><![CDATA[raw*]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:19:10 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 14:19:36 GMT]]></title><description><![CDATA[<p>gibt ne funktion die heisst strcat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237655</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:19:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 14:35:48 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>gibt ne funktion die heisst strcat</p>
</blockquote>
<p>Noch besser: Er kann mit <code>std::string</code> arbeiten und dann einfach die Membermethode <code>c_str()</code> (bzw. <code>data()</code> , was praktisch das gleiche ist aber vom Funktionsnamen her die Intuition wohl besser ausdrueckt <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="😃"
    /> ) verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237657</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:35:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 14:29:19 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>(bzw. <code>data()</code> , C++11) verwenden.</p>
</blockquote>
<p>string::data ist C++98, du denkst vermutlich gerade an vector.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237659</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:29:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 14:33:37 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>(bzw. <code>data()</code> , C++11) verwenden.</p>
</blockquote>
<p>string::data ist C++98, du denkst vermutlich gerade an vector.</p>
</blockquote>
<p>jup. <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="🙂"
    /> Editiert, thx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237664</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 14:33:42 GMT]]></title><description><![CDATA[<p>strcat hängt einen C-String hinter einen anderen.<br />
Du musst (im Gegensatz zu C++) selbst dafür sorgen, dass der &quot;aufnehmende&quot; String genug Speicherplatz bietet für strlen(str1)+strlen(str2)+1 (für abschließendes '\0').<br />
C Fragen gehören ist C Subforum und nicht ins C++ Subforum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237665</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:33:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 15:45:12 GMT]]></title><description><![CDATA[<p>raw* schrieb:</p>
<blockquote>
<p>In meinem Fall kann ich keinen std::string verwenden weil Binär Daten versendet werden müssen.</p>
</blockquote>
<p>Was hat das eine mit dem anderen zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237701</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 01 Aug 2012 15:45:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 18:42:24 GMT]]></title><description><![CDATA[<p>Jetzt mal ne konstruktive Antwort:</p>
<p>Längen merken und memcpy (<a href="http://www.cplusplus.com/reference/clibrary/cstring/memcpy/" rel="nofollow">http://www.cplusplus.com/reference/clibrary/cstring/memcpy/</a>) benutzen.<br />
Zielbereich entsprechend dimensionieren versteht sich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237751</guid><dc:creator><![CDATA[EOP]]></dc:creator><pubDate>Wed, 01 Aug 2012 18:42:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 18:56:47 GMT]]></title><description><![CDATA[<p>An memcpy hatte ich auch schon gedacht, jedoch musst du da ja noch die Länge angeben, d.h. du musst dann noch extra strlen aufrufen, was glaube ich nicht ganz so optimal ist. Warum mehr aufwand betreiben, als nötig? Ich würde auch sagen benutz strcat.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237755</guid><dc:creator><![CDATA[yihaaa]]></dc:creator><pubDate>Wed, 01 Aug 2012 18:56:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 19:20:57 GMT]]></title><description><![CDATA[<p>EOP schrieb:</p>
<blockquote>
<p>Längen merken und memcpy benutzen.</p>
</blockquote>
<p>Du willst ihn wohl zum Masochismus treiben.</p>
<p>Die beste Loesung ist nach wie vor die Verwendung von std::string.<br />
Man muss hier nicht unnoetig C und C++ mischen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237757</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 19:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 19:28:09 GMT]]></title><description><![CDATA[<p>raw* schrieb:</p>
<blockquote>
<p>In meinem Fall kann ich keinen std::string verwenden weil Binär Daten versendet werden müssen.</p>
</blockquote>
<p>Es verhält sich genau anders herum - std::string kann problemlos mit Binärdaten umgehen, während das mit C-Strings nicht möglich ist - denn ein C-String ist per Definition beim ersten NUL zu Ende.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237758</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 01 Aug 2012 19:28:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Wed, 01 Aug 2012 23:07:55 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Du willst ihn wohl zum Masochismus treiben.</p>
</blockquote>
<p>Nö, sonst hätte ich ihm vorgeschlagen alle deine posts zu lesen.</p>
<p>Athar schrieb:</p>
<blockquote>
<p>Es verhält sich genau anders herum - std::string kann problemlos mit Binärdaten umgehen, während das mit C-Strings nicht möglich ist - denn ein C-String ist per Definition beim ersten NUL zu Ende.</p>
</blockquote>
<p>Man kann eben nur nicht C-Funktionen wie strcat, strlen benutzen. Deshalb habe ich ja &quot;Länge merken und memcpy&quot; vorgeschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237794</guid><dc:creator><![CDATA[EOP]]></dc:creator><pubDate>Wed, 01 Aug 2012 23:07:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Thu, 02 Aug 2012 08:31:54 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Es verhält sich genau anders herum - std::string kann problemlos mit Binärdaten umgehen, während das mit C-Strings nicht möglich ist - denn ein C-String ist per Definition beim ersten NUL zu Ende.</p>
</blockquote>
<p>Ich dachte eigentlich immer char * (bzw. vector&lt;char&gt;(DataSize); ) müsste man für Binärdaten verwenden.</p>
<p>Also ich meine wie soll ich z.b. Binärdaten aus einer Datei in einen std::string einlesen soweit ich weiss geht das doch gar nicht oder?</p>
<p>Hier <a href="http://www.cplusplus.com/reference/iostream/istream/read/" rel="nofollow">http://www.cplusplus.com/reference/iostream/istream/read/</a> wird ja auch char* benutzt mit std::string funktioniert die read bzw. write Funktion ja nicht. (Ja, ich weiss vector ist besser nehme ich auch für solche Sachen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237844</guid><dc:creator><![CDATA[raw**]]></dc:creator><pubDate>Thu, 02 Aug 2012 08:31:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Thu, 02 Aug 2012 08:42:16 GMT]]></title><description><![CDATA[<p>raw** schrieb:</p>
<blockquote>
<p>Also ich meine wie soll ich z.b. Binärdaten aus einer Datei in einen std::string einlesen soweit ich weiss geht das doch gar nicht oder?</p>
<p>Hier <a href="http://www.cplusplus.com/reference/iostream/istream/read/" rel="nofollow">http://www.cplusplus.com/reference/iostream/istream/read/</a> wird ja auch char* benutzt mit std::string funktioniert die read bzw. write Funktion ja nicht. (Ja, ich weiss vector ist besser nehme ich auch für solche Sachen.)</p>
</blockquote>
<p>Es ist zwar in C++98 streng genommen nicht definiert, dass ein String seine Elemente hintereinander speichert, aber die Implementierung, die das nicht tut, muss erst noch erfunden werden. In C++11 ist sogar garantiert, dass alles hintereinander steht. Daher kannst du die Elemente in den String genau so reinbekommen wie in einen Vector.</p>
<p>Die Frage, die ich mir stelle, ist, was der Vorteil von String gegenüber Vector sein soll, wenn es um Binärdaten geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237847</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 02 Aug 2012 08:42:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Thu, 02 Aug 2012 09:47:23 GMT]]></title><description><![CDATA[<p>Ok, eine letzte Frage hab ich noch:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

int main()
{

string abc=&quot;\x41\x42\x00\x43&quot;;

ofstream f (&quot;file.txt&quot;,ios::binary);
f.write(abc.c_str(),4);

system(&quot;PAUSE&quot;);
return 0;
}
</code></pre>
<p>Wenn ich die erstellte Datei im Hexeditor anschaue dann steht dort: 41 42 00 00<br />
Wenn ich aber z.b. benutze</p>
<pre><code class="language-cpp">char *abc=&quot;\x41\x42\x00\x43&quot;;
</code></pre>
<p>dann steht in der Datei 41 42 00 43</p>
<p>Im Debugger sehe ich das der string aber die Binärdaten enthält dann scheint das Problem wohl bei c._str() zu liegen aber das mach auch std::string doch char* oder nicht?</p>
<p>Deshalb denke ich jetzt das char* für Binärdaten doch besser wäre weil Binärdaten natürlich auch Nullbytes enthalten können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237857</guid><dc:creator><![CDATA[raw**]]></dc:creator><pubDate>Thu, 02 Aug 2012 09:47:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Thu, 02 Aug 2012 10:04:42 GMT]]></title><description><![CDATA[<p>edit: Deine Zuweisung am Anfang ist falsch. Das weist dem String einen nullterminierten C-String zu, der hier eben nur zwei Zeichen hat. Guck dir mal die anderen Konstruktoren und Funktionen von String an und was sie <strong>genau</strong> machen.</p>
<p><strong>Aber</strong>: Mich würde immer noch interessieren, warum du String und nicht Vector für Binärdaten nimmst. String ist eigentlich eher auf &quot;normale&quot; Zeichenketten hin designed.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237862</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 02 Aug 2012 10:04:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Thu, 02 Aug 2012 11:21:38 GMT]]></title><description><![CDATA[<blockquote>
<p>anschaue dann steht dort: 41 42 00 00</p>
</blockquote>
<p>Die Konvertierung zwischen <code>char*</code> und <code>std::string</code> beruecksichtigt nur 0-terminierte Strings. Wenn du mittels <code>abc.size()</code> die Laenge vorher pruefst, so wird sie 2 sein. D.h. der Einsatz von 4 bei <code>write</code> ist falsch.</p>
<pre><code class="language-cpp">char tmp[] =&quot;\x41\x42\x00\x43&quot;;
string abc(tmp, tmp+sizeof(tmp)-1);
ofstream f (&quot;file.raw&quot;,ios::binary); 
f.write(abc.data(),abc.size());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2237890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237890</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 02 Aug 2012 11:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Thu, 02 Aug 2012 12:51:35 GMT]]></title><description><![CDATA[<p>Ahh, ich glaub jetzt hab ichs, c_str(); dachte wohl mein string wäre schon zu ende als es das Nullbyte gesehen hat.</p>
<p>Ein Nullbyte Kennzeichnet ja eigentlich auch das string ende ...</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Aber: Mich würde immer noch interessieren, warum du String und nicht Vector für Binärdaten nimmst. String ist eigentlich eher auf &quot;normale&quot; Zeichenketten hin designed</p>
</blockquote>
<p>Ja, Vector gefällt mir eigentlich ganz gut.</p>
<p>Aber hier liegt mein Problem:</p>
<pre><code class="language-cpp">vector&lt;char*&gt;DBG;
DBG.push_back(&quot;IRGENDEIN HEADER\r\n&quot;););
DBG.push_back(&quot;Size: 200\r\n&quot;);
</code></pre>
<p>Ich muss einen request versenden der so aussieht:<br />
Bsp:<br />
IRGENDEIN HEADER<br />
Size: 200</p>
<p>Und wenn ich meine Vector so zusammenbau wie in dem Beispiel dann funktioniert das mit dem request nicht mehr. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237915</guid><dc:creator><![CDATA[raw**]]></dc:creator><pubDate>Thu, 02 Aug 2012 12:51:35 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Thu, 02 Aug 2012 13:21:09 GMT]]></title><description><![CDATA[<p>raw** schrieb:</p>
<blockquote>
<p>Ahh, ich glaub jetzt hab ichs, c_str(); dachte wohl mein string wäre schon zu ende als es das Nullbyte gesehen hat.</p>
</blockquote>
<p>Nein, das überhaupt nichts damit zu tun. Bitte lies die Antworten gründlich.</p>
<blockquote>
<p>Ein Nullbyte Kennzeichnet ja eigentlich auch das string ende ...</p>
</blockquote>
<p>Für Funktionen aus cstring (bzw. string.h) vielleicht. Nicht bei std::string.</p>
<blockquote>
<pre><code class="language-cpp">vector&lt;char*&gt;DBG;
DBG.push_back(&quot;IRGENDEIN HEADER\r\n&quot;););
DBG.push_back(&quot;Size: 200\r\n&quot;);
</code></pre>
</blockquote>
<p>So langsam muss ich sagen: Lern C++. Dein Modell und die technische Umsetzung passen überhaupt nicht zusammen. Da liegt offenbar ein großes Missverständnis von Zeichenketten, Standardcontainern und allgemein der Behandlung von Daten vor.</p>
<p>Du möchtest hier sicherlich einen vector&lt;char&gt; (oder vielleicht doch einen String? Du gibst so wenig Infos und weichst Gegenfragen immer aus). Davon ausgehend gehen die Zuweisungen dann auch komplett anders. Da du vermutlich von C kommst: Ein vector&lt;char*&gt; entspricht einem char**. Dir ist klar, warum das nicht passen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237922</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 02 Aug 2012 13:21:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Thu, 02 Aug 2012 13:58:40 GMT]]></title><description><![CDATA[<p>raw** schrieb:</p>
<blockquote>
<p>Ok, eine letzte Frage hab ich noch:</p>
<pre><code class="language-cpp">string abc=&quot;\x41\x42\x00\x43&quot;;
</code></pre>
<p>...</p>
</blockquote>
<p>Da passiert der Fehler. Eine Konstante &quot;foo&quot; schreibt 4 Bytes in den Speicher. Und zwar die 3 Buchstaben und ein null Byte. Wird damit ein std::string erzeugt, sucht der Konstruktor von std::string nach dem ersten null Byte und übernimmt die Zeichen bis dahin.</p>
<p>Die Konstante &quot;\x41\x42\x00\x43&quot; schreibt eben 5 Bytes in den Speicher. Der Konstruktor sucht hier auch das erste null Byte und findet es aber an der 3. Stelle. Nur die ersten 2 Zeichen \x41 und \x42 werden in den str::string übernommen. Willst Du wirklich alle Zeichen in den std::string übernehmen, geht das mit:</p>
<pre><code class="language-cpp">std::string abc(&quot;\x41\x42\x00\x43, 4);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2237935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237935</guid><dc:creator><![CDATA[ich bins]]></dc:creator><pubDate>Thu, 02 Aug 2012 13:58:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C-String on Thu, 02 Aug 2012 14:10:39 GMT]]></title><description><![CDATA[<p>raw** schrieb:</p>
<blockquote>
<p>Ein Nullbyte Kennzeichnet ja eigentlich auch das string ende ...</p>
</blockquote>
<p>Bei einem C-String wuerde (die C++-Version von) <code>strlen</code> so aussehen:</p>
<pre><code class="language-cpp">template&lt;charT&gt; //Oder so aehnlich. Selbst geschrieben.
size_t strlen(charT const* ptr)
{
    size_t rval(0);
    while( ptr++ ) ++rval;
    return rval;
}
</code></pre>
<p>Es wird bis zum ersten Terminierungszeichen (0 oder als character-Literal: '\0') gelesen.<br />
wie aber sieht <code>std::string::length()</code> aus?</p>
<pre><code class="language-cpp">template&lt; //Oder so aehnlich. Selbst geschrieben.
    typename CharT, 
    typename Traits, 
    typename Allocator
&gt;
typename basic_string&lt;CharT, Traits, Allocator&gt;::size_type basic_string::length() const
{
    return mSize;//Oder so aehnlich
}
</code></pre>
<p>Hier wird ein interner, vorzeichenloser Skalar zurueckgegeben. Was heisst das? std::string speichert die Laenge mit! Und fuer den sind damit Terminierungszeichen irrelevant:</p>
<pre><code class="language-cpp">std::string a(5, '\0'); // Ein String, der aus 5 Nullbytes besteht

std::cout &lt;&lt; a.length(); //5
</code></pre>
<p>Wieso funktioniert dann folgendes nicht:</p>
<pre><code class="language-cpp">std::string a = &quot;\0\0\0\0\0&quot;;
std::cout &lt;&lt; a.length();
</code></pre>
<p>Das in der ersten Zeile nennt sich copy-initialisation. Hier wird a der Wert &quot;\0\0\0\0\0&quot; zugewiesen; der entsprechende Konstruktor wird aufgerufen.</p>
<p>Allerdings kennt dieser Konstruktor die Laenge des uebergebenen C-Strings nicht; er muss ihn also als Null-terminiert betrachten und hoert damit beim ersten Buchstaben auf. Die Laenge ist dementsprechend 0.</p>
<p>Wie es trotzdem geht?</p>
<pre><code class="language-cpp">char const[] meinScheiss = &quot;\0\0\0\0\0&quot;;

std::string a(meinScheiss, meinScheiss + sizeof MeinScheiss); //start-end Iteratorenpaar Konstruktor

std::cout &lt;&lt; a.length();
</code></pre>
<p>Hier wird 6 herausgegeben. Wieso?<br />
Sehen wir uns an, was da steht:</p>
<pre><code class="language-cpp">char const[] meinScheiss = &quot;\0\0\0\0\0&quot;;
</code></pre>
<p>Wird vom Compiler zu</p>
<pre><code class="language-cpp">char const[6] meinScheiss = {'\0', '\0', '\0', '\0', '\0', '\0'};
</code></pre>
<p>Geaendert. An die Fuenf Terminierungszeichen wird noch eines rangehaengt (macht der Compiler bei solchen Literalen automatisch).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237947</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 02 Aug 2012 14:10:39 GMT</pubDate></item></channel></rss>