<?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[Zeichenkette invertieren]]></title><description><![CDATA[<p>Aufgabenstellung:<br />
Schreiben Sie eine Funktion, die einen String, der als globale Variable vereinbart und im Hauptprogramm eingelesen wird, in umgekehrter Reihenfolge wieder ausgibt. Verwenden Sie weder Schleifen noch Routinen aus externen Bibliotheken (z.B. strlen).</p>
<p>Mein Code bisher:</p>
<pre><code>#include&lt;iostream&gt;
using namespace std;

string zeichenkette;

int laenge = 0;
int i = 0;
int laengeRekursiv(string zeichenkette){

    if(zeichenkette[i] =='\0'){
        return 0;
    }else{
        i++;
        laenge++;
        laengeRekursiv(zeichenkette);
    }
    return laenge;
}

void invertieren(string zeichenkette, int stringlaenge){
    char element;

    if(stringlaenge &lt; 0){
        return;
    }else{
        element = zeichenkette[stringlaenge];
        cout &lt;&lt; element;

        invertieren(zeichenkette,--stringlaenge);
    }
    return;
}

int main(){
    bool wiederholung = true;

    while(wiederholung){

        cout &lt;&lt; &quot;Eingabe Zeichenkette: &quot;;
        cin &gt;&gt; zeichenkette;

        int stringlaenge = laengeRekursiv(zeichenkette);

        invertieren(zeichenkette, stringlaenge-1);
        cout &lt;&lt; endl;

        cout &lt;&lt; &quot;Neue Zeichenkette invertieren - ja(1) oder nein(0): &quot;;
        cin &gt;&gt; wiederholung;
    }

    return 0;
}
</code></pre>
<p>Obwohl ich damit eine Zeichenkette invertieren kann, hätte ich einige Fragen.<br />
Wenn ich für meine Funktion den Datentyp string als Rückgabewert gerne hätte, wie kann ich das am besten realisieren?<br />
Also wenn ich kein cout in meiner Funktion möchte.</p>
<p>Probiert habe ich es mit:</p>
<pre><code>string invertierteZeichenkette;
int l = 0;

string invertieren(string zeichenkette, int stringlaenge){
    if(stringlaenge &lt; 0){
        return;
    }else{
        invertierteZeichenkette[l] = zeichenkette[stringlaenge];
        l++;
        stringlaenge--;

        invertieren(zeichenkette,stringlaenge);
    }
    return invertierteZeichenkette;
}
</code></pre>
<p>Beim Rückgabetyp meiner Abbruchbedingung bin ich mir nicht sicher. Darum habe ich sie vorerst weggelöscht<br />
Kann das in einer ähnlichen Form funktionieren?</p>
<p>Ich würde gerne den ganzen invertierten String zurückgeben als Funktionsergebnis.</p>
<p>Freue mich über jede Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327785/zeichenkette-invertieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 22:44:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327785.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Sep 2014 09:03:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeichenkette invertieren on Thu, 04 Sep 2014 09:03:03 GMT]]></title><description><![CDATA[<p>Aufgabenstellung:<br />
Schreiben Sie eine Funktion, die einen String, der als globale Variable vereinbart und im Hauptprogramm eingelesen wird, in umgekehrter Reihenfolge wieder ausgibt. Verwenden Sie weder Schleifen noch Routinen aus externen Bibliotheken (z.B. strlen).</p>
<p>Mein Code bisher:</p>
<pre><code>#include&lt;iostream&gt;
using namespace std;

string zeichenkette;

int laenge = 0;
int i = 0;
int laengeRekursiv(string zeichenkette){

    if(zeichenkette[i] =='\0'){
        return 0;
    }else{
        i++;
        laenge++;
        laengeRekursiv(zeichenkette);
    }
    return laenge;
}

void invertieren(string zeichenkette, int stringlaenge){
    char element;

    if(stringlaenge &lt; 0){
        return;
    }else{
        element = zeichenkette[stringlaenge];
        cout &lt;&lt; element;

        invertieren(zeichenkette,--stringlaenge);
    }
    return;
}

int main(){
    bool wiederholung = true;

    while(wiederholung){

        cout &lt;&lt; &quot;Eingabe Zeichenkette: &quot;;
        cin &gt;&gt; zeichenkette;

        int stringlaenge = laengeRekursiv(zeichenkette);

        invertieren(zeichenkette, stringlaenge-1);
        cout &lt;&lt; endl;

        cout &lt;&lt; &quot;Neue Zeichenkette invertieren - ja(1) oder nein(0): &quot;;
        cin &gt;&gt; wiederholung;
    }

    return 0;
}
</code></pre>
<p>Obwohl ich damit eine Zeichenkette invertieren kann, hätte ich einige Fragen.<br />
Wenn ich für meine Funktion den Datentyp string als Rückgabewert gerne hätte, wie kann ich das am besten realisieren?<br />
Also wenn ich kein cout in meiner Funktion möchte.</p>
<p>Probiert habe ich es mit:</p>
<pre><code>string invertierteZeichenkette;
int l = 0;

string invertieren(string zeichenkette, int stringlaenge){
    if(stringlaenge &lt; 0){
        return;
    }else{
        invertierteZeichenkette[l] = zeichenkette[stringlaenge];
        l++;
        stringlaenge--;

        invertieren(zeichenkette,stringlaenge);
    }
    return invertierteZeichenkette;
}
</code></pre>
<p>Beim Rückgabetyp meiner Abbruchbedingung bin ich mir nicht sicher. Darum habe ich sie vorerst weggelöscht<br />
Kann das in einer ähnlichen Form funktionieren?</p>
<p>Ich würde gerne den ganzen invertierten String zurückgeben als Funktionsergebnis.</p>
<p>Freue mich über jede Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416046</guid><dc:creator><![CDATA[estrella]]></dc:creator><pubDate>Thu, 04 Sep 2014 09:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to Zeichenkette invertieren on Thu, 04 Sep 2014 09:30:44 GMT]]></title><description><![CDATA[<pre><code>string invertieren(string zeichenkette)
{
    return std::string(zeichenkette.rbegin(), zeichenkette.rend());
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Ernsthaft jetzt:<br />
1. Du hast <code>#include &lt;string&gt;</code> vergessen.<br />
2. Es muss nicht zwingendermassen ein <code>'\0'</code> am Ende des Strings stehen. Daher besser <code>zeichenkette.c_str()</code> messen.</p>
<p>Hier mein Ansatz hierfür:</p>
<pre><code>std::size_t StrLen(char const* CStr)
{
	if(*CStr)
	{
		return StrLen(++CStr) + 1;
	}
	return 0;
}
std::size_t StrLen(std::string const&amp; Str)
{
	return StrLen(Str.c_str());
}
</code></pre>
<p>Hoffentlich hattet ihr Überladung schon. Sonst einfach die zweite Funktion mit demselben Bezeichner weglassen und die Funktion stattdessen mit <code>StrLen(zeichenkette.c_cstr());</code> aufrufen.</p>
<p>3. Deine zweite Funktion ist schon recht nahe dran. Ich kommentiere mal:</p>
<p>estrella schrieb:</p>
<blockquote>
<pre><code>string invertierteZeichenkette; // Die beiden globalen Variablen hier kann man auch vermeiden
int l = 0;

string invertieren(string zeichenkette, int stringlaenge){
    if(stringlaenge &lt; 0){ // Wäre mit std::size_t nicht nötig gewesen.
        return; // Falscher Rückgabetyp
    }else{
        invertierteZeichenkette[l] = zeichenkette[stringlaenge]; // zeichenkette[stringlaenge] ist von den Bezeichnern her nicht mehr im gültigen Bereich! (ich hab schon gesehen dass du in der main-Funktion -1 gerechnet hast aber dennoch irreführend)
        l++; // Wieso Postfix?
        stringlaenge--; // Dito
        
        invertieren(zeichenkette,stringlaenge);
    }
    return invertierteZeichenkette;
}
</code></pre>
</blockquote>
<p>Hier mal meine (in-place) Variante, hoffentlich kannst du etwas daraus entnehmen:</p>
<pre><code>void Reverse(std::string&amp; Str, std::size_t Begin, std::size_t End)
{
	if(Begin &lt; End &amp;&amp; Begin &lt; --End)
	{
		char Temp = Str[Begin];
		Str[Begin] = Str[End];
		Str[End] = Temp;
		Reverse(Str, ++Begin, End);
	}
}
void Reverse(std::string&amp; Str)
{
	return Reverse(Str, 0, StrLen(Str));
}
</code></pre>
<p>Und wenn du darauf bestehst, dass eine Kopie zurückgegeben wird, dann lässt sich das auch einfach wrappen:</p>
<pre><code>std::string ReverseCopy(std::string Str) // Beachte: Call by value, also Kopie
{
	Reverse(Str);
	return Str;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2416049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416049</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 04 Sep 2014 09:30:44 GMT</pubDate></item><item><title><![CDATA[Reply to Zeichenkette invertieren on Thu, 04 Sep 2014 10:18:01 GMT]]></title><description><![CDATA[<p>estrella schrieb:</p>
<blockquote>
<p>Aufgabenstellung:<br />
Schreiben Sie eine Funktion, die einen String, der als globale Variable vereinbart und im Hauptprogramm eingelesen wird, in umgekehrter Reihenfolge wieder ausgibt.</p>
</blockquote>
<p>Die Funktion soll ausgeben. &quot;ausgeben&quot; ist nicht &quot;zurückgeben&quot;. Also holzwegst Du an der Aufgabenstellung vorbei. Mich würde es wundern, wenn echt &lt;string&gt; gemeint wäre statt char[] bei dieser Aufgabenstellung. Um dabei externe Funktionen zu vermeiden, muß man wohl '\0' am Stringende annehmen. Uih, man darf sicherlich gar nicht *str.end() anschauen. Ich mache zur Sicherheit ein '\0' in meinem Programm dran.<br />
Die Schleife in der main() ist nur lästig.</p>
<pre><code>#include&lt;iostream&gt;
#include&lt;string&gt;
using namespace std;

string zeichenkette;

void ausgebenVorwarts(int pos) {
	if(zeichenkette[pos]!='\0') {
		cout&lt;&lt;zeichenkette[pos];
		ausgebenVorwarts(pos+1);
	}
}

void ausgebenRueckwaerts(int pos) {
	if(zeichenkette[pos]!='\0') {
		ausgebenRueckwaerts(pos+1);
		cout&lt;&lt;zeichenkette[pos];
	}
}

int main() {
	cout&lt;&lt;&quot;Eingabe Zeichenkette: &quot;;
	cin&gt;&gt;zeichenkette;
	zeichenkette+='\0';

	ausgebenVorwarts(0);
	cout&lt;&lt;'\n';
	ausgebenRueckwaerts(0);
	cout&lt;&lt;'\n';
}
</code></pre>
<p>Oder mit char[] und minimal:</p>
<pre><code>#include&lt;iostream&gt;
using namespace std;

char zeichenkette[80];

void ausgebenRueckwaerts(int pos) {
	if(zeichenkette[pos]!='\0') {
		ausgebenRueckwaerts(pos+1);
		cout&lt;&lt;zeichenkette[pos];
	}
}

int main() {
	cout&lt;&lt;&quot;Eingabe Zeichenkette: &quot;;
	cin.getline(zeichenkette,sizeof(zeichenkette));
	ausgebenRueckwaerts(0);
}
</code></pre>
<p>Hat doch auch ne gewisse Schönheit, nur das zu machen, was gefordert war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416056</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 04 Sep 2014 10:18:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zeichenkette invertieren on Thu, 04 Sep 2014 10:57:47 GMT]]></title><description><![CDATA[<p>Vielen lieben Dank für die großartige Unterstützung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416061</guid><dc:creator><![CDATA[estrella]]></dc:creator><pubDate>Thu, 04 Sep 2014 10:57:47 GMT</pubDate></item></channel></rss>