Rekursive Funktion: Cstring rückwärts ausgeben



  • Moin,

    ich versuche eine rekursive Funktion zu schreiben, die mir einen CString rueckwaerts ausgibt. Als Parameter darf ich nur die Adresse des ersten Feldes benutzen. Mein Code funkioniert nicht. Habt Ihr einen Tipp für mich?

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    void rekvorwaerts(char *feld);
    
    int main()
    {
        char feld[10]="Hallo 59!";
        rekvorwaerts(&feld[0]);
        getch();
    }
    
    void rekvorwaerts(char *feld)
    {
         if(strlen(feld)>0)
             rekvorwaerts(&feld[0]);
         cout<<feld[strlen(feld)-1];
         feld[strlen(feld)-1]='\0';
    }
    


  • void rekvorwaerts(char *feld)
    {
         if(strlen(feld)>0)
             rekvorwaerts(&feld[1]);
         cout<< feld[0];
    }
    


  • Vielen Dank.
    Aber wieso muss ich die Adresse des 1.Index benutzen?



  • Weil es das nächste zeichen ist. Ansonsten hast du da eine Endlosschleife und irgendwann läuft dein Stack über und die Anwendung crasht.



  • Heißt das &feld[1] in dem Fall soviel wie "um 1 erhöhen"?
    Und wieso funktioniert die Bedingung strlen(feld)?
    Die CStringlaenge wird doch nciht verändert, oder?



  • Es gibt noch eine andere Möglichkeit:

    #include <algorithm>
    #include <iostream>
    #include <conio.h>
    
    void print_rev( char * str )
    {
       if( str ){
          std::reverse( str, str + strlen(str));
          std::cout << str;
       }
    }
    
    int main(){
        char str[] = "Hallo 59!";
        print_rev( str );
        getch();
    }
    

    Diese wäre sogar schneller bei größeren strings weil du nicht jedes mal strlen benutzen musst. Sondern es nur einmal verwendet wird.



  • Phisherman schrieb:

    Heißt das &feld[1] in dem Fall soviel wie "um 1 erhöhen"?
    Und wieso funktioniert die Bedingung strlen(feld)?
    Die CStringlaenge wird doch nciht verändert, oder?

    Nein aber die übergebene Addresse des strings zeigt auf das nächste zeichen und strlen zählt nur von der addresse an die du übergibst bis es ein '\0' findet.

    1. Durchlauf:
    [abcdefg]
    2. Durchlauf:
    [a][bcdefg]
    3. Durchlauf
    [ab][cdefg]
    ...



  • sieht nach 'ner Hausaufgabe aus. Die Lösung hätte ich so schnell nicht verraten. Aber da eine Lösung hier ja schon steht, gebe ich mal meinen Senf dazu: Ich würde mir aber das strlen sparen und &p[1] kann man auch durch p+1 ersetzen...

    void fuckyeah(char const* p)
    {
      if (*p) {
        fuckyeah(p+1);
        std::cout << *p;
      }
    }
    


  • krümelkacker schrieb:

    sieht nach 'ner Hausaufgabe aus. Die Lösung hätte ich so schnell nicht verraten. Aber da eine Lösung hier ja schon steht, gebe ich mal meinen Senf dazu: Ich würde mir aber das strlen sparen und &p[1] kann man auch durch p+1 ersetzen...

    Nun ja ich verstehe zwar das es eine Hausaufgabe ist aber er hat wenigstens schon mal etwas versucht. Ausserdem versucht er es ja jetzt noch zu verstehen 🙂



  • Achso! OK, jetzt hab ich's verstanden. Die andere Methode schaut in meinen Augen kryptisch aus. Sowas habe ich noch nie gemacht. Außerdem wollte ich doch eine rekursive Funktion?!



  • Nein, es ist keine Hausaufgabe. Sowas gibt's bei uns nicht. Wir bearbeiten alle Aufgaben im Unterricht. Übrigens ist die Aufgabe als schwierig deklariert und muss nicht einmal gelöst werden. 😉



  • Phisherman schrieb:

    Nein, es ist keine Hausaufgabe. Sowas gibt's bei uns nicht. Wir bearbeiten alle Aufgaben im Unterricht. Übrigens ist die Aufgabe als schwierig deklariert und muss nicht einmal gelöst werden. 😉

    Die Version von krümelkacker ist schon besser. Sogar besser als meine nicht rekursive 😉 (Nur das da nicht auf NULL-Zeiger geachtet wird)


Log in to reply