<?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::string replace_all()?]]></title><description><![CDATA[<p>Hallo,<br />
ich empfange in meinem Programm HTML-Quelltext und möchte diesen dann in einer Textbox darstellen. Wie ihr wisst, muss man dabei unter Windows einen Zeilenumbruch durch CRLF (\r\n) darstellen, die Server senden hingegen meist nur LF (\n).</p>
<p>Hat jemand zufällig eine möglichst kompakte Funktion, um alle LF eines std::string durch CRLF zu ersetzen? Ich möchte ungern auf zusätzliche Bibliotheken zurückgreifen und es stattdessen mit Bordmitteln lösen. Oder ist das umständlich und man kann irgendwie einfach dem Server sagen, das er gleich die (für Windows) korrekte Version sendet?</p>
<p>Das Problem ist ja auch, dass ein Suchen nach LF und einfaches Ersetzen nicht ausreicht, da man dann auch Ergebnisse im Falle eines bereits vorhandenen CRLF bekommt und man dann beim Ersetzen schließlich CRCRLF erhalten würde. Und reguläre Ausdrücke gehören ja leider auch nicht zum &quot;Lieferumfang&quot; von C++.</p>
<p>Gruß<br />
ph4nt0m</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246639/std-string-replace_all</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 23:37:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246639.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Jul 2009 17:30:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::string replace_all()? on Thu, 30 Jul 2009 17:30:46 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich empfange in meinem Programm HTML-Quelltext und möchte diesen dann in einer Textbox darstellen. Wie ihr wisst, muss man dabei unter Windows einen Zeilenumbruch durch CRLF (\r\n) darstellen, die Server senden hingegen meist nur LF (\n).</p>
<p>Hat jemand zufällig eine möglichst kompakte Funktion, um alle LF eines std::string durch CRLF zu ersetzen? Ich möchte ungern auf zusätzliche Bibliotheken zurückgreifen und es stattdessen mit Bordmitteln lösen. Oder ist das umständlich und man kann irgendwie einfach dem Server sagen, das er gleich die (für Windows) korrekte Version sendet?</p>
<p>Das Problem ist ja auch, dass ein Suchen nach LF und einfaches Ersetzen nicht ausreicht, da man dann auch Ergebnisse im Falle eines bereits vorhandenen CRLF bekommt und man dann beim Ersetzen schließlich CRCRLF erhalten würde. Und reguläre Ausdrücke gehören ja leider auch nicht zum &quot;Lieferumfang&quot; von C++.</p>
<p>Gruß<br />
ph4nt0m</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752544</guid><dc:creator><![CDATA[ph4nt0m]]></dc:creator><pubDate>Thu, 30 Jul 2009 17:30:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::string replace_all()? on Thu, 30 Jul 2009 17:46:21 GMT]]></title><description><![CDATA[<p>Bist du dir sicher, dass die Textbox entsprechend reagiert? Früher war es mal so, aber ich dachte bei den neuere Windowsversionen sei dies nicht mehr der Fall.</p>
<p>Ansonsten kannst du einfach über<a href="http://www.cplusplus.com/reference/string/string/find/" rel="nofollow"> <code>std::string::find</code> </a>nach <code>'\r'</code> suchen, prüfst ob es ein nächstes Zeichen hat, wenn dem der Fall ist schaust du ob es ein <code>'\n'</code> ist, wenn nicht dann fügst du über<a href="http://www.cplusplus.com/reference/string/string/insert/" rel="nofollow"> <code>std::string::insert</code> </a>eines ein. Danach geht es weiter mit std::string::find, allerdings gibst du nun an, ab wo gesucht werden soll.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752553</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 30 Jul 2009 17:46:21 GMT</pubDate></item><item><title><![CDATA[Reply to std::string replace_all()? on Thu, 30 Jul 2009 19:03:55 GMT]]></title><description><![CDATA[<p>ph4nt0m schrieb:</p>
<blockquote>
<p>Hat jemand zufällig eine möglichst kompakte Funktion, um alle LF eines std::string durch CRLF zu ersetzen?</p>
</blockquote>
<p>Der C++ Standard hat nichts zu bieten, man muss sich immer alles zusammenfrickeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752587</guid><dc:creator><![CDATA[nenene.]]></dc:creator><pubDate>Thu, 30 Jul 2009 19:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::string replace_all()? on Thu, 30 Jul 2009 20:03:20 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Bist du dir sicher, dass die Textbox entsprechend reagiert? Früher war es mal so, aber ich dachte bei den neuere Windowsversionen sei dies nicht mehr der Fall.</p>
</blockquote>
<p>Ja, zumindest die normalen Steuerelemente der Win32-API können mit einem einfachen \n nichts anfangen und drucken dann einen &quot;Kasten&quot;.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Ansonsten kannst du einfach über<a href="http://www.cplusplus.com/reference/string/string/find/" rel="nofollow"> <code>std::string::find</code> </a>nach <code>'\r'</code> suchen, prüfst ob es ein nächstes Zeichen hat, wenn dem der Fall ist schaust du ob es ein <code>'\n'</code> ist, wenn nicht dann fügst du über<a href="http://www.cplusplus.com/reference/string/string/insert/" rel="nofollow"> <code>std::string::insert</code> </a>eines ein.</p>
</blockquote>
<p>Naja, ein einzelnes \r wird wohl niemals vorkommen, sondern entweder nur ein \n oder eben \r\n. Das Problem ist, dass, wenn ich nach \n suche, ich nicht dieses einfach durch \r\n ersetzen kann, da in Wirklichkeit vor dem gefundenen \n bereits ein \r vorhanden sein könnte. Es scheint nämlich Server zu geben, die bereits &quot;Windows-konform&quot; senden.</p>
<p>Wie auch immer, mit so einigen gesonderten Abfragen habe ich jetzt meiner Meinung nach beide Fälle abgedeckt:</p>
<pre><code class="language-cpp">size_t pos = 0;
while((pos = str.find(TEXT('\n'), pos)) != std::string::npos)
{
	if(pos == 0 || str.at(pos-1) != TEXT('\r'))
		str.replace(pos, 1, TEXT(&quot;\r\n&quot;));
	pos += 2;
}
</code></pre>
<p>Wenn ihr spontan irgendwelche Fehler entdeckt, wäre es sehr nett, mir dies mitzuteilen <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752612</guid><dc:creator><![CDATA[ph4nt0m]]></dc:creator><pubDate>Thu, 30 Jul 2009 20:03:20 GMT</pubDate></item><item><title><![CDATA[Reply to std::string replace_all()? on Thu, 30 Jul 2009 22:37:31 GMT]]></title><description><![CDATA[<p>ph4nt0m schrieb:</p>
<blockquote>
<p>Naja, ein einzelnes \r wird wohl niemals vorkommen, ...</p>
</blockquote>
<p>Gibt es alte Mac Server? *hatte da aus irgendeinem Grund den alten Mac im Hinterkopf*</p>
<p>ph4nt0m schrieb:</p>
<blockquote>
<p>Das Problem ist, dass, wenn ich nach \n suche, ich nicht dieses einfach durch \r\n ersetzen kann, da in Wirklichkeit vor dem gefundenen \n bereits ein \r vorhanden sein könnte.</p>
</blockquote>
<p>Gleiches Vorgehen wie mit meinem Algo, einfach einen Schritt rückwärts gehen <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>
<pre><code class="language-cpp">size_t pos = 0;
while((pos = str.find(TEXT('\n'), pos)) != std::string::npos)
{
	if(pos == 0 || str.at(pos-1) != TEXT('\r'))
		str.replace(pos, 1, TEXT(&quot;\r\n&quot;));
	pos += 2;
}
</code></pre>
<p>ph4nt0m schrieb:</p>
<blockquote>
<p>Wenn ihr spontan irgendwelche Fehler entdeckt, wäre es sehr nett, mir dies mitzuteilen <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="🙂"
    /></p>
</blockquote>
<p>Ja, da gibt es ein paar Fehler.<br />
1. Ich nehme mal an, dass <code>str</code> ein Objekt des Typs <code>std::string</code> ist, dann ist das Makro <code>TEXT</code> hier ganz sicher ein Fehler. <code>std::string</code> ist immer ein <code>std::basic_string&lt;char&gt;</code> . Mit dem Makro <code>TEXT</code> machst du aber aus den Literalen womöglich ein <code>L''</code> oder <code>L&quot;&quot;</code> also ein <code>wchar_t</code> Literal.<br />
2. Wieso die <code>at</code> Funktion? Du kannst hier durch Logik garantieren, dass der Index immer im Bereich der Zeichenkette sein wird, da ist der zusätzliche Aufwand für die Prüfung unnötig. Nimmer lieber den<a href="http://www.cplusplus.com/reference/string/string/operator%5B%5D/" rel="nofollow"> <code>operator[]</code> </a>.<br />
3. Wieso die <code>replace</code> Funktion? Du überschreibst ein Zeichen, welches bereits vorhanden ist. Nimm doch<a href="http://www.cplusplus.com/reference/string/string/insert/" rel="nofollow"> <code>std::string::insert(pos, 1, '\r')</code> </a>.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752685</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 30 Jul 2009 22:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to std::string replace_all()? on Thu, 30 Jul 2009 22:52:54 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort.</p>
<p>Zu Punkt 1: Nein, es handelt sich um ein std::basic_string&lt;TCHAR&gt; Objekt und damit sollte das TEXT-Makro doch völlig korrekt sein. Oder gibt es einen anderen/besseren Weg, sein Programm nur durch Änderung einer einzelnen Anweisung/Option wahlweise mit oder ohne Unicode kompilieren zu können?</p>
<p>Die anderen Punkte nehme ich aber dankend an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752688</guid><dc:creator><![CDATA[ph4nt0m]]></dc:creator><pubDate>Thu, 30 Jul 2009 22:52:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::string replace_all()? on Thu, 30 Jul 2009 23:22:34 GMT]]></title><description><![CDATA[<p>ph4nt0m schrieb:</p>
<blockquote>
<p>Zu Punkt 1: Nein, es handelt sich um ein std::basic_string&lt;TCHAR&gt; Objekt und damit sollte das TEXT-Makro doch völlig korrekt sein.</p>
</blockquote>
<p>Oh! Ja.</p>
<p>ph4nt0m schrieb:</p>
<blockquote>
<p>Oder gibt es einen anderen/besseren Weg, sein Programm nur durch Änderung einer einzelnen Anweisung/Option wahlweise mit oder ohne Unicode kompilieren zu können?</p>
</blockquote>
<p>Wie wäre es, wenn du ausschliesslich in Unicode kompilieren würdest? Das wäre zumindest einfacher <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752697</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 30 Jul 2009 23:22:34 GMT</pubDate></item></channel></rss>