string (char pointer) gespiegelt zurückliefern
-
guten abend,
folgende aufgabe:
schreiben sie eine funktion, die einen string (char pointer) übergeben bekommt und einen neuen string zurückliefert, der das gespiegelte wort enthält. vermeiden sie vordefinierte funktionen wie strlen, cpy.
ich habe mir folgendes überlegt:
ich gehe den übergebenen char pointer durch. solange der wert != '\0' ist zähle ich eine variable hoch, um später zu wissen, in welcher speicheradresse der letzte buchstabe steht.void rev(char* str) { int cnt = 0; bool b = true; while(b) { if(*str == '\0') { b = false; } else { ++cnt; ++str; } } }
allerdings muss ich ja jetzt noch den string rückwärts ausgeben. ich wollte das über eine for-schleife machen, in der ich auf die speicheradresse des pointers die cnt-variable draufzähle, um dann ab der letzten position rückwärts ausgeben zu können. allerdings weiß ich nicht, wie ich das umsetzen könnte. hatte mir etwas in der art überlegt:
for(char* p = str+cnt; cnt > 0; cnt--,p--)
allerdings funktioniert das so logischerweise nicht, ich habe aber auch leider keinen anderen vernünftigen ansatz.
kann das denn in so etwa hinkommen, oder liege ich sowieso völlig daneben, was den lösungsansatz angeht?vielen dank schonmal!
-
Die Funktionen, die du nicht benutzen darfst haben einen Grund warum sie da aufgelistet sind.
Auf eine Art musst du strlen emulieren. Wie könnte man das tun? (ist trivial zu implementieren) und dann kannst du ja einen temporären string anlegen und dann da rückwärts die Zeichen einsetzen. (du hast ja die Länge, also kannst du einfach runter zählen). Am Ende kopierst du die Zeichen wieder zurück an die Stelle, auf die der übergebene Zeiger verweist.
-
Ungetestet, aber es bereinigt ein paar Logikfehler bei dir:
char *rev(char *str) { // Es soll ja ein neuer String zurückgegeben werden int cnt = 0; while(*(str+cnt)) ++cnt; // Deine alte Zählschleife war sehr umständlich. Es gibt einen Grund, warum man in C Strings mit Nullzeichen terminiert. Hier siehst du ihn. // Jetzt haben wir die Länge des Strings (hätten auch strlen nehmen können, aber wir machen heute mal alles von Hand) // Jetzt müssen wir einen neuen String konstruieren. // Dazu brauchen wir erstmal Speicherplatz char *reverse = new char[cnt+1]; // Machst du eigentlich C oder C++? Dein Programm sah sehr nach C aus, aber du fragst im C++ Forum // In C musst du das statt new mit malloc machen. // Das +1 ist für das Nullterminierungszeichen // Und jetzt wird kopiert, wie du das auch schon wolltest: for (char *p=str+cnt-1, *r=reverse; p!=str; --p, ++r) (*r)=(*p); // Das -1 ist da, weil das erste Element des strings bei str und nicht bei str+1 liegt. // Und noch eine Nullterminierung hinten dran: *(reverse+cnt+1)=0; // Und das sollte es eigentlich gewesen sein: return reverse; }
Das fliegt einem wahrscheinlich total um die Ohren, da ich das nicht getestet habe, aber es zeigt dir sicher einen Ansatz.
edit: Ok, ein bisschen getestet habe ich es jetzt doch noch. Es funktioniert.
-
SeppJ schrieb:
Es funktioniert.
Nicht ganz. Der leere String wird dir um die Ohren fliegen.
-
camper schrieb:
SeppJ schrieb:
Es funktioniert.
Nicht ganz. Der leere String wird dir um die Ohren fliegen.
Wusste doch, dass ich was übersehen habe! Wäre ja auch überraschend, wenn so eine Cstring-Frickelei auf Anhieb richtig wäre.
Das zu Beheben überlasse ich zur Übung dem Threadersteller, das ist einfach.
-
SeppJ schrieb:
camper schrieb:
SeppJ schrieb:
Es funktioniert.
Nicht ganz. Der leere String wird dir um die Ohren fliegen.
Wusste doch, dass ich was übersehen habe! Wäre ja auch überraschend, wenn so eine Cstring-Frickelei auf Anhieb richtig wäre.
Das zu Beheben überlasse ich zur Übung dem Threadersteller, das ist einfach.
Es ist nicht nur der leere String. Das sieht so aus, als ob das erste Zeichen des Ursprungsstrings nicht kopiert wird, weil - das ist ein gerne gemachter Fehler - das erste Dekrementieren vor der Abbruchprüfung stattfindet. Aus Bequemlichkeit, weil man in der Schleife auf das Vorgängerzeichen zugreifen möchte.
for (char *p=str+cnt, *r=reverse; p!=str; ) *r++=*--p;
Bei einer vorwärtslaufenden Schleife kommt man ja auch nicht auf die Idee, von vornherein beim zweiten Element anzufangen.