<?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[String Problem II]]></title><description><![CDATA[<p>Huhu,</p>
<p>Wieder sitz ich fest...</p>
<p>Die Funktion &gt;&gt;umdrehen&lt;&lt; bekommt einen String übergeben und dreht ihn um.<br />
Das Problem:</p>
<p>Input: 123456<br />
Output: 65432</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

std::string umdrehen(std::string text)
{
	std::string textCopy = text;
	int zwsp=0;
	for(int i=textCopy.length(); i &gt;= 0 ;i--)
	{
		text[zwsp] = textCopy[i];
		zwsp++;
	}
	return(text);
}

int main() {
	std::string eingabe;
	std::cout &lt;&lt; &quot;Bitte Text eingeben:&quot; &lt;&lt; std::endl;
	std::getline(std::cin,eingabe);
	std::cout &lt;&lt; &quot;Der umgedrehte Text lautet: &quot; &lt;&lt; umdrehen(eingabe) &lt;&lt; std::endl;
}
</code></pre>
<p>Mein 2. Problem:</p>
<p>Wie definier ich eine Space - Zeichenkonstante ' '<br />
Der Compiler ärgert mich und sagt &quot;Fehler, keine gültige Zeichenkonstante. Ich will mit dem ' ' ein Space darstellen.</p>
<p>Würde mich auf Antworten freuen!</p>
<p>Lg Mentras</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243983/string-problem-ii</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 13:44:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243983.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Jun 2009 16:54:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String Problem II on Tue, 23 Jun 2009 16:54:54 GMT]]></title><description><![CDATA[<p>Huhu,</p>
<p>Wieder sitz ich fest...</p>
<p>Die Funktion &gt;&gt;umdrehen&lt;&lt; bekommt einen String übergeben und dreht ihn um.<br />
Das Problem:</p>
<p>Input: 123456<br />
Output: 65432</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

std::string umdrehen(std::string text)
{
	std::string textCopy = text;
	int zwsp=0;
	for(int i=textCopy.length(); i &gt;= 0 ;i--)
	{
		text[zwsp] = textCopy[i];
		zwsp++;
	}
	return(text);
}

int main() {
	std::string eingabe;
	std::cout &lt;&lt; &quot;Bitte Text eingeben:&quot; &lt;&lt; std::endl;
	std::getline(std::cin,eingabe);
	std::cout &lt;&lt; &quot;Der umgedrehte Text lautet: &quot; &lt;&lt; umdrehen(eingabe) &lt;&lt; std::endl;
}
</code></pre>
<p>Mein 2. Problem:</p>
<p>Wie definier ich eine Space - Zeichenkonstante ' '<br />
Der Compiler ärgert mich und sagt &quot;Fehler, keine gültige Zeichenkonstante. Ich will mit dem ' ' ein Space darstellen.</p>
<p>Würde mich auf Antworten freuen!</p>
<p>Lg Mentras</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731720</guid><dc:creator><![CDATA[Mentras]]></dc:creator><pubDate>Tue, 23 Jun 2009 16:54:54 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Tue, 23 Jun 2009 17:29:02 GMT]]></title><description><![CDATA[<p>Mentras schrieb:</p>
<blockquote>
<p>Das Problem:</p>
<p>Input: 123456<br />
Output: 65432</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

std::string umdrehen(std::string text)
{
	std::string textCopy = text;
	int zwsp=0;
	for(int i=textCopy.length(); i &gt;= 0 ;i--)
	{
		text[zwsp] = textCopy[i];
		zwsp++;
	}
	return(text);
}

int main() {
	std::string eingabe;
	std::cout &lt;&lt; &quot;Bitte Text eingeben:&quot; &lt;&lt; std::endl;
	std::getline(std::cin,eingabe);
	std::cout &lt;&lt; &quot;Der umgedrehte Text lautet: &quot; &lt;&lt; umdrehen(eingabe) &lt;&lt; std::endl;
}
</code></pre>
</blockquote>
<p>Lass dir mal text.length() ausgeben und überleg noch mal GANZ SCHARF, bei welchem Index Arrays (oder hier auch strings) immer anfangen. Tip: es ist nicht 1.</p>
<p>Außerdem ist das Übergeben als Kopie mit viel Kopieraufwand verbunden. Übergib doch mal ne Referenz!</p>
<p>So könnte es dann ausschauen:</p>
<pre><code class="language-cpp">std::string umdrehen(const std::string&amp; text)
{
    std::string ret;
    for(int i=text.length()-1; i &gt;= 0 ;i--)
    {
        ret.push_back(text[i]);
    }
    return ret;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1731740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731740</guid><dc:creator><![CDATA[friedel fiedel]]></dc:creator><pubDate>Tue, 23 Jun 2009 17:29:02 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Tue, 23 Jun 2009 17:45:17 GMT]]></title><description><![CDATA[<p>Danke es klappt, nur verstehen tu ich´s nicht...</p>
<p>for(int i=textCopy.length()<strong>-1</strong>; i &gt;= 0 ;i--)<br />
{<br />
text[zwsp] = textCopy[i];<br />
zwsp++;<br />
}</p>
<p>Ich hab jetzt nur das -1 nach textCopy.lenght() dazu gegeben.</p>
<p>Wieso klappt es jetzt? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Die Schleife wird ja dadurch kürzer. Oh Backe, sicher gibt´s dafür eine klare Antwort. Wäre dankbar wenn du Sie mir erklären könntest.</p>
<blockquote>
<p>Lass dir mal text.length() ausgeben und überleg noch mal GANZ SCHARF, bei welchem Index Arrays (oder hier auch strings) immer anfangen. <strong>Tip: es ist nicht 1.</strong></p>
</blockquote>
<p>Das weiß ich doch, hab ich doch nirgendwo im Code stehen oder ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Sorry für diese &quot;blöden&quot; Fragen, aber ich versteh´s einfach nicht. Bin ja auch hart am lernen.</p>
<p>Lg Mentras</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731745</guid><dc:creator><![CDATA[Mentras]]></dc:creator><pubDate>Tue, 23 Jun 2009 17:45:17 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Tue, 23 Jun 2009 18:07:25 GMT]]></title><description><![CDATA[<p>gehs doch mal an nem beispiel durch:</p>
<p>&quot;abc&quot;<br />
-&gt;<br />
<code>for(int i=textCopy.length(); i &gt;= 0 ;i--)</code><br />
length = 3<br />
-&gt; i=3, i=2, i=1, i=0</p>
<p><code>text[zwsp] = textCopy[i];</code><br />
text[0] = i[3]<br />
text[1] = i[2]<br />
text[2] = i[1]<br />
text[3] = i[0]</p>
<p>-&gt;<br />
&quot;\0cba&quot;<br />
aber da length schon explizit auf 3 gesetzt wurde (beim copy-ctor), bekommst du nur die ersten 3 zeichen ausgegeben:<br />
&quot;\0cb&quot;<br />
-&gt;<br />
&quot;cb&quot;</p>
<p>wobei das erste zeichen ('\0') implementation defined ist - heißt, dass du nicht davon ausgehen solltest, dass es auch wirklich so ist...</p>
<p>btw:</p>
<pre><code class="language-cpp">std::string umdrehen(const std::string&amp; text)
{
    std::string ret;
    ret.reserve(text.length()); //nicht notwendig, aber eigtl ne tolle sache ^^
    for(int i=text.length()-1; i &gt;= 0 ;i--)
    {
        ret.push_back(text[i]);
    }
    return ret;
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::string umdrehen(const std::string&amp; text)
{
    std::string R = text;
    std::string::size_type laenge = text.length();
    for(std::string::size_type i(laenge), e(laenge/2); i != e; --i)
    {
        std::swap(R[i], R[laenge-i]);
    }
    return R;
}
</code></pre>
<p>oder (nicht so hübsch)</p>
<pre><code class="language-cpp">std::string umdrehen(const std::string&amp; text)
{
    std::string R = text;
    std::string::size_type laenge = R.length();
    for(std::string::size_type i(laenge), e(laenge/2), i2(0); i2 != laenge; --i, ++i2)
    {
        text[i] = text[i2];
    }
    return R;
}
</code></pre>
<p>oder (mein favorit)</p>
<pre><code class="language-cpp">std::string GetReverse(const std::string &amp;value)
{
  std::string R(value.rend(), value.rbegin());
  return R;
}
</code></pre>
<p>bb</p>
<p>PS: Ist alles ungetestet und kann durchaus fehler beinhalten - aber vll haste ja lust mal zu gucken, wie was funktioniert und siehst dann auch, dass du nicht gerade den besten weg gewählt hast ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731753</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 23 Jun 2009 18:07:25 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Tue, 23 Jun 2009 18:46:40 GMT]]></title><description><![CDATA[<p>Ahhhh,</p>
<p>diese /0 ist das Ende eines Strings oder wie?</p>
<p>Nagut, mit meinem Wissen hab ich daweil den besten Weg gewählt <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="😃"
    /></p>
<p>Bei den aufgelisteten Methoden, die du mir gezeigt hast, verstehe ich die erste Zeile nicht ganz. Vielleicht aber später, wenn ich das Buch durch habe.</p>
<pre><code class="language-cpp">std::string umdrehen(const std::string&amp; text)
</code></pre>
<p>Du deklarierst hier eine Funktion namens &quot;umdrehen&quot; vom Typ String. Die einen Konstanten String-Wert übergeben bekommt,......*buff* schlagt der Hammer zu.<br />
Danach kommt der Adreßoperator, ... und dann schweigt mein Hirn und versorgt meine Zunge nicht mehr mit Wissen^^</p>
<p>Lg Mentras</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731768</guid><dc:creator><![CDATA[Mentras]]></dc:creator><pubDate>Tue, 23 Jun 2009 18:46:40 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Tue, 23 Jun 2009 19:27:25 GMT]]></title><description><![CDATA[<p>Mentras schrieb:</p>
<blockquote>
<p>Ahhhh,</p>
<p>diese /0 ist das Ende eines Strings oder wie?</p>
</blockquote>
<p>Nö, hat er doch gescgrieben, dass das von Implementierung zu Implementierung anders sein kann. Es liegt nicht an dem Null-terminiertem String, sondern daran, dass du deinen textCopy als KOPIE des Ursprungsstrings erstellt hast. Damit hat er eine bestimmte Länge, über die hinaus du nicht schreiben kannst. Da du am Anfang str[str.length()] eingefügt hast (was ja nicht geht) hast du einen Index schon mit Müll belegt (wahrscheinlich tatsächlich &quot;\0&quot;), somit bleiben dir nur noch length() -1 indizes zu belegen, was einer zu wenig für den kompletten String ist, drum bliebe die 1 in deinem Beispiel unkopiert.</p>
<blockquote>
<pre><code class="language-cpp">std::string umdrehen(const std::string&amp; text)
</code></pre>
<p>Du deklarierst hier eine Funktion namens &quot;umdrehen&quot; vom Typ String. Die einen Konstanten String-Wert übergeben bekommt,......*buff* schlagt der Hammer zu.<br />
Danach kommt der Adreßoperator, ... und dann schweigt mein Hirn und versorgt meine Zunge nicht mehr mit Wissen^^</p>
</blockquote>
<p>Mach dich mal Schlau &quot;Call by Value&quot; und &quot;Call by Reference&quot;.<br />
(Kurz: Du übergibst eine Kopie an die Funktion, das mit dem &quot;&amp;&quot; nur eine Referenz, also die Adresse. Das geht schneller, da der String nicht kopiert werden muss.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731786</guid><dc:creator><![CDATA[friedel fiedel]]></dc:creator><pubDate>Tue, 23 Jun 2009 19:27:25 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Tue, 23 Jun 2009 20:00:53 GMT]]></title><description><![CDATA[<p>Vielen Dank, Friedel und unskilled.<br />
Hab´s allmählich verstanden.<br />
Hier für euch <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>
<p><a href="http://www.fleurop.de/Images/Product_Images/xichliebe_l.jpg" rel="nofollow">http://www.fleurop.de/Images/Product_Images/xichliebe_l.jpg</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731805</guid><dc:creator><![CDATA[Mentras]]></dc:creator><pubDate>Tue, 23 Jun 2009 20:00:53 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Tue, 23 Jun 2009 21:58:09 GMT]]></title><description><![CDATA[<p>gern geschehen ^^</p>
<p>ist auch schade, dass die implementierung so etwas überhaupt zulässt:</p>
<pre><code class="language-cpp">std::string R(&quot;asd&quot;);
R[3] = '\0';
</code></pre>
<p>warum ist mir schon klar(zumindest beim MSVC) - weil string eben von irgend ner vector-basisklasse erbt - und da sinnigerweise(std::string::c_str) die '\0' noch hinten im vector steht...<br />
hätte aber erwartet, dass da im debug-mode noch irgend nen extra op[] definiert wird, der das checkt - aber man kann eben nich alles haben ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731839</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 23 Jun 2009 21:58:09 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Wed, 24 Jun 2009 01:15:35 GMT]]></title><description><![CDATA[<p>friedel fiedel schrieb:</p>
<blockquote>
<p>Außerdem ist das Übergeben als Kopie mit viel Kopieraufwand verbunden. Übergib doch mal ne Referenz!</p>
<p>So könnte es dann ausschauen:</p>
<pre><code class="language-cpp">std::string umdrehen(const std::string&amp; text)
{
    std::string ret;
    for(int i=text.length()-1; i &gt;= 0 ;i--)
    {
        ret.push_back(text[i]);
    }
    return ret;
}
</code></pre>
</blockquote>
<p>Was die Performanz angeht, kann man das sogar noch steigern. Hier ist die &quot;Swaptimization&quot; ... <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>
<pre><code class="language-cpp">string umdrehen(string x)
{
    string ret;
    ret.swap(x); //&lt; string::swap ist schnell
    for (int i=0, j=ret.length()-1; i&lt;j; ++i,--j) {
        char c = ret[i];
        ret[i] = ret[j];
        ret[j] = c;
    }
    return ret;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1731892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731892</guid><dc:creator><![CDATA[Swaptimizer]]></dc:creator><pubDate>Wed, 24 Jun 2009 01:15:35 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Wed, 24 Jun 2009 01:23:42 GMT]]></title><description><![CDATA[<p>@Swaptimizer<br />
bringts total, da auf swap zu setzen und dafür die kopie schon früher anfertigen zu lassen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> n1</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1731893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731893</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 24 Jun 2009 01:23:42 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Wed, 24 Jun 2009 01:58:27 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>@Swaptimizer<br />
bringts total, da auf swap zu setzen und dafür die kopie schon früher anfertigen zu lassen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> n1</p>
</blockquote>
<p>Nun, ich habe mit dem Optimierungsthema nicht angefangen. Wollte nur drauf hinweisen, dass &quot;da noch was geht&quot;. Ich war am Überlegen, ob ich noch erklären soll, warum das in einigen Fällen besser sein kann. Es war wohl doch nicht offensichtlich. Die &quot;swaptimierte&quot; Version setzt nicht nur auf swap sondern auch auf Compiler die unnötige Kopien bei Rvalue-Argumenten wegoptimieren können (copy elision). Du kannst ja mal &quot;string&quot; selbst wie einen vector implementieren (also ohne copy-on-write) und testen, wie oft Du bei folgendem Beispiel eine Kopie des Heap-allozierten Zeichen-Arrays durchführen musst:</p>
<pre><code class="language-cpp">string quelle() {return &quot;Hallo Welt!&quot;;}
  int main() {
    string hw = umdrehen(umdrehen(quelle()));  
    cout &lt;&lt; hw &lt;&lt; endl;
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1731894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1731894</guid><dc:creator><![CDATA[Swaptimizer]]></dc:creator><pubDate>Wed, 24 Jun 2009 01:58:27 GMT</pubDate></item><item><title><![CDATA[Reply to String Problem II on Wed, 24 Jun 2009 19:23:06 GMT]]></title><description><![CDATA[<p>Es gibt übrigens auch <code>std::reverse()</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1732343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1732343</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Jun 2009 19:23:06 GMT</pubDate></item></channel></rss>