<?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[std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte]]></title><description><![CDATA[<p>Hallo,</p>
<p>noch ein kleines Problem: Ich muss aus einer legacy C-API einen null-terminierten C-String aus einem Speicherereich vorgegebener Länge einlesen. In miner Applikation ist das ganze natürlich ein std::string.</p>
<p>Die Funktion, die mir den null-terminierten C-String gibt, erwartet einen char* und eine Länge.</p>
<p>Der String kann bis zu 256 characters lang sein und ich habe keine Möglichkeit vorher zu wissen, wie lang das ding wirklich ist, also wo das Null-byte steht.</p>
<p>Mein Ansatz daher:</p>
<pre><code class="language-cpp">std::vector&lt;char&gt; vc;
vc.resize(256);
legacy_c_funktion(&amp;(vc[0]), 256);
std::string str(vc.begin(), vc.end());
</code></pre>
<p>Das hat leider zur Folge, dass dann str ein String ist, der immer 256 Zeichen hat, wo vorne das gewünschte drin steht und danach nur noch Whitespace.<br />
Daraufhin habe ich mir ein paar trim()-Funktion für std::string angeguckt, aber leider liefert sowohl boost::algorithm::trim als auch diverse andere selbstkodierte trim-Funktionen immer den String mit whitespaces zurück, was mich vermuten lässt, dass das was ich als whitespace angezeigt bekomme, gar kein whitespace ist, sondern was anderes nicht darstellbares.</p>
<p>Also: Wie stelle ich sicher, dass beim kopieren des char-vectors in den String beim 0-char auch tatsächlich terminiert wird??</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270095/std-vector-lt-char-gt-nach-std-string-terminiert-nicht-bei-null-byte</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 17:00:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270095.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Jul 2010 13:27:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte on Tue, 06 Jul 2010 13:27:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>noch ein kleines Problem: Ich muss aus einer legacy C-API einen null-terminierten C-String aus einem Speicherereich vorgegebener Länge einlesen. In miner Applikation ist das ganze natürlich ein std::string.</p>
<p>Die Funktion, die mir den null-terminierten C-String gibt, erwartet einen char* und eine Länge.</p>
<p>Der String kann bis zu 256 characters lang sein und ich habe keine Möglichkeit vorher zu wissen, wie lang das ding wirklich ist, also wo das Null-byte steht.</p>
<p>Mein Ansatz daher:</p>
<pre><code class="language-cpp">std::vector&lt;char&gt; vc;
vc.resize(256);
legacy_c_funktion(&amp;(vc[0]), 256);
std::string str(vc.begin(), vc.end());
</code></pre>
<p>Das hat leider zur Folge, dass dann str ein String ist, der immer 256 Zeichen hat, wo vorne das gewünschte drin steht und danach nur noch Whitespace.<br />
Daraufhin habe ich mir ein paar trim()-Funktion für std::string angeguckt, aber leider liefert sowohl boost::algorithm::trim als auch diverse andere selbstkodierte trim-Funktionen immer den String mit whitespaces zurück, was mich vermuten lässt, dass das was ich als whitespace angezeigt bekomme, gar kein whitespace ist, sondern was anderes nicht darstellbares.</p>
<p>Also: Wie stelle ich sicher, dass beim kopieren des char-vectors in den String beim 0-char auch tatsächlich terminiert wird??</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922246</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Tue, 06 Jul 2010 13:27:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte on Tue, 06 Jul 2010 13:30:10 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::vector&lt;char&gt; vc;
vc.resize(256);
legacy_c_funktion(&amp;(vc[0]), 256);
std::string str(vc.begin(), std::find(vc.begin(), vc.end(), 0));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1922249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922249</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 06 Jul 2010 13:30:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte on Tue, 06 Jul 2010 13:34:06 GMT]]></title><description><![CDATA[<p>Dürfte nicht auch ein</p>
<pre><code class="language-cpp">std::string str(&amp;vc[0]);
</code></pre>
<p>reichen? Der Konstruktor von String sollte den Vector dann als nullterminiertes char-Array interpretieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922256</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 06 Jul 2010 13:34:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte on Tue, 06 Jul 2010 13:34:44 GMT]]></title><description><![CDATA[<p>Oder einfach so:</p>
<pre><code class="language-cpp">std::string str(&amp;(vc[0]));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1922258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922258</guid><dc:creator><![CDATA[player4245]]></dc:creator><pubDate>Tue, 06 Jul 2010 13:34:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte on Tue, 06 Jul 2010 13:38:14 GMT]]></title><description><![CDATA[<p>Boah, Facepalm!!!!! Danke. Hab heute schon zu lange programmiert <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/1922261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922261</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Tue, 06 Jul 2010 13:38:14 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte on Tue, 06 Jul 2010 13:40:58 GMT]]></title><description><![CDATA[<p>Mein Vorschlag:</p>
<pre><code class="language-cpp">char vc[256];                // reserve 256 bytes on the stack
legacy_c_funktion(vc, 256);  // fill them with legacy_c_funktion
vc[sizeof vc - 1] = 0;       // ensure vc is however '\0' terminated
std::string str(vc);         // copy significant data from stack to the heap
</code></pre>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922263</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 06 Jul 2010 13:40:58 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte on Tue, 06 Jul 2010 13:44:29 GMT]]></title><description><![CDATA[<p>sizeof(vc) wird aber immer 256 zurückgeben. D.h. das immer alle Zeichen des Arrays interpretiert werden. Deshalb steht dann in dem string nach dem eigentlichen Inhalt undefinierte Zeichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922264</guid><dc:creator><![CDATA[player4245]]></dc:creator><pubDate>Tue, 06 Jul 2010 13:44:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte on Tue, 06 Jul 2010 14:16:42 GMT]]></title><description><![CDATA[<p>Hallo player4245,</p>
<p>klar:</p>
<pre><code class="language-cpp">vc[sizeof vc - 1] = 0;
</code></pre>
<p>setzt nur ein nullbyte ans Ende von vc, also das 256te Zeichen wird null.</p>
<p>eine</p>
<pre><code class="language-cpp">legacy_c_funktion(vc, 256);
</code></pre>
<p>muss jedoch auch ein Nullbyte ans Ende der signifikaten Zeichen setzen<br />
um die Länge der Zeichekette zu signalisieren.<br />
Davon sind auch alle anderen Vorschläge ausgegangen.</p>
<p>Einziger Sonderfall, wenn die Anzahl signifikater Zeichen &gt;= 256 Zeichen ist.<br />
Hier gibts es in C Funktionen, die kein null byte mehr schreiben - warum auch immer. Eine nachfolgende Suche/Kopie (std::string str(vc)) bis zum Nullbyte führt dann zu UB.</p>
<pre><code class="language-cpp">vc[sizeof vc - 1] = 0;
</code></pre>
<p>kann entfallen, wenn die legacy_c_funktion zweifelsfrei,<br />
auch in der Grenzsituation, null terminiert.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922288</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 06 Jul 2010 14:16:42 GMT</pubDate></item><item><title><![CDATA[Reply to std::vector&amp;lt;char&amp;gt; nach std::string terminiert nicht bei Null-byte on Tue, 06 Jul 2010 14:18:39 GMT]]></title><description><![CDATA[<p>Warum nicht gleich initialisieren?</p>
<pre><code class="language-cpp">char vc[256] = {};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1922291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922291</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 06 Jul 2010 14:18:39 GMT</pubDate></item></channel></rss>