String durchsuchen und ersetzen
-
Hallo. Ich bin immer noch in meiner Klausur Vorbereitung und bitte wieder um Hilfe.
Die Aufgabe ist: Es soll ein String dursucht werden und immer wenn dort ein Ph auftaucht soll dieses in F ersetzt werden. Bsp. Hallo Photo soll geändert werden in Hallo Foto.
Ich stehe so ziemlich auf dem Schlauch. Habe jetzt einiges probiert und komme irgendwie nicht zum Ziel. Die ist meiner Codestruktur:#include <stdio.h> #include <stdlib.h> #include <string.h> void ReplacePh(char *text); int main(void){ char *text = "Hallo Photo"; ReplacePh(text); return 0; } void ReplacePh(char *text){ char* out; //////// char *origin = text; char *pos = strstr(text, "Ph"); while (pos){ strcpy(out, text); }
Die Funtionsdeklaration ist so vorgeben. Ich habe jetzt den ganzem Müll den ich versucht habe entfernt und bitte um Hilfe wie ich das lösen soll.
-
Mag sein, dass dein jetziger Weg zum Ziel führen mag, aber schön wird das nicht. Du musst anfangen, in C-Strings zu denken, du denkst zu stark in den string-Funktionen. Du musst aber selber eine solche Funktion schreiben, anstatt die fertigen Funktionen zusammen zu setzen.
Das Grundgerüst praktisch jeder Stringfunktion in C ist, dass man den String durchgeht bis man das Ende (also '\0') erreicht. Hier hättest du zwei Stellen, die du dir merken musst: Die Stelle zum Durchgehen von vorne nach hinten und eine Stelle an die du schreibst. Zusätzlich solltest du dir merken, ob der vorherige Buchstabe ein 'P' war. Dann gehst du, wie schon gesagt, mit dem Lesezeiger von vorne nach hinten durch und schreibst das aktuelle Zeichen an die Schreibposition (Lese- und Schreibzeiger sind zu Anfang gleich). Der Schreibzeiger wird auch jedes mal eins weiter gesetzt. Wenn der vorherige Buchstabe war 'P' und der jetzige Buchstabe ist 'h', gehst du vor dem Schreiben aber um eine Position zurück, dahin wohin du das 'P' geschrieben hast. Da schreibst du ein 'F'. Dann geht es normal weiter.
Das war's in Worten, diese kann man ziemlich 1:1 nach C übersetzen.
-
SeppJ schrieb:
Du musst aber selber eine solche Funktion schreiben, anstatt die fertigen Funktionen zusammen zu setzen.
Kann man so machen, muss man aber nicht.
Wenn es thematisch passende Funktionen (oder sogar Funktionen aus dem Standard) gibt, so wie hier, ziehe ich immer die Verwendung dieser eigenem Rumgefrickel vor.- die while-Schleife ist sinnfrei angewendet
- strcpy zerstört dir durch terminierendes '\0' den Originalstring
- die schreibst in ein Stringliteral -> UB
-
Sorry, aber ich kriege einfach keinen klaren Gedanken. So sieht es bei mir jetzt aus:
#include <stdio.h> #include <stdlib.h> #include <string.h> void ReplacePh(char *text); int main(void){ char *text = "Photo"; ReplacePh(text); return 0; } void ReplacePh(char *text){ char temp1[100]; char *pos = strstr (text, "Ph"); char P = "P"; char h = "h"; char F = "F"; char leer = ""; for (int i = 0; text[i] != '\0'; i++){ if (text[i] == P && text[i+1] == h){ pos = strstr } else{ temp1[i] = text[i];} } }
-
Wutz schrieb:
SeppJ schrieb:
Du musst aber selber eine solche Funktion schreiben, anstatt die fertigen Funktionen zusammen zu setzen.
Kann man so machen, muss man aber nicht.
Wenn es thematisch passende Funktionen (oder sogar Funktionen aus dem Standard) gibt, so wie hier, ziehe ich immer die Verwendung dieser eigenem Rumgefrickel vor.- die while-Schleife ist sinnfrei angewendet
- strcpy zerstört dir durch terminierendes '\0' den Originalstring
- die schreibst in ein Stringliteral -> UBDas sind aber ziemlich gewichtige Probleme, die man hier wegen der Benutzung der fertigen Funktionen hat. Würde mich wundern, wenn das am Ende wenigstens genau so schön wäre wie die komplett selbst gemachte Variante. Ich würde sogar erwarten, dass es damit wesentlich komplizierter wird als wenn man es selber schreibt.
Da ich mal nicht annehme, dass der TE dem Lehrer folgendes glaubwürdig verkaufen kann, habe ich keine Skrupel eine Komplettlösung zu posten. Mit ein bisschen Nachdenken kann man auch das von mir zuerst vorgeschlagene Zwischenmerken des letzten Buchstabens loswerden, indem man stattdessen den nächsten Buchstaben anguckt, den man an der Stelle bereits kennt:
#include <stdio.h> void ReplacePh(char *text) { char *put = text; while(*put = *text++) { if (*put == 'P' && *text == 'h') { *put = 'F'; ++text; } ++put; } } int main(void){ char text[] = "Photo Photo PhPhPhhPh PhotoPh"; // Man beachte den Fehler in der Vorgabe, wo hier char *text stand. ReplacePh(text); puts(text); return 0; }
Eine Schleife, zwei Variablen, eine Verzweigung. Wie würdest du es machen?
PS: @snboy2010: Autsch. Da fehlen noch Grundlagen, was überhaupt der Unterschied zwischen Zeichen und Zeichenketten ist. 'f' ist ein Zeichen, "f" ist eine Zeichenkette. Und Zeichenketten mittels == zu vergleichen macht nicht, was du denkst. Wozu überhaupt diese Variablen?
Weiterhin scheinst du zu vergessen:
-Das soll laut Aufgabenstellung für beliebig viele Ph funktionieren.
-Das soll bestimmt auch für beliebig lange Zeichenketten funktionieren.
Derzeit scheinst du noch überhaupt keinen Plan formuliert zu haben, wie das überhaupt auf Papier funktionieren könnte. Mach das unbedingt mal! Dann kannst du es in Ruhe nach C übersetzen.
-
So simple soll es seien? Werde es gleich probieren.
Eine etwas andere Frage. Hier ist sehr viel Expertise vorhanden. Würde sich hier jemand anbieten in Form einer Onlinenachhilfe mich bei der Vorbereitung auf die Klausur zu Unterstützen? Natürlich gegen Bezahlung zu den üblichen Nachhilfepreisen. Also für 90min 30^Euro.
-
#include <stdio.h> #include <stdlib.h> #include <string.h> void ReplacePh(char *text); int main(void){ char text[] = "Hallo Photo"; ReplacePh(text); puts(text); return 0; } void ReplacePh(char *text){ // Anfänger sollten immer for benutzen, while ist was für Profis for(char *pos = strstr(text, "Ph"); pos!=NULL; pos = strstr(text, "Ph")) { pos[0]='F'; // Ersetzen eines Zeichens memmove(pos+1,pos+2,strlen(pos+1)); // Verschieben des Rests +1 nach vorn } }
-
Ich fürchte, dafür habe ich nicht wirklich Zeit. Aber das was ich hier gezeigt habe, steht in jedem vernünftigen Lehrbuch beschrieben. K&R entwickeln beispielsweise nach und nach einige Stringfunktionen der Standardbibliothek als Demonstration (Wobei in dem Kapitel aber, wenn ich mich recht erinnere, ein Fehler im Code der 2 Edition ist. Das Buch richtet sich eben an den aufmerksamen Leser
).
-
Wutz schrieb:
void ReplacePh(char *text){ // Anfänger sollten immer for benutzen, while ist was für Profis for(char *pos = strstr(text, "Ph"); pos!=NULL; pos = strstr(text, "Ph")) { pos[0]='F'; // Ersetzen eines Zeichens memmove(pos+1,pos+2,strlen(pos+1)); // Verschieben des Rests +1 nach vorn } }
Ok, das ist eine ziemlich gute Lösung
. Bisschen Laufzeitineffizient natürlich, aber so kritisch sollte man bei der Aufgabe nicht sein.
-
SeppJ schrieb:
Bisschen Laufzeitineffizient natürlich
Da hast du natürlich recht, ich korrigiere mich dementsprechend von
ziehe ich immer die Verwendung dieser eigenem Rumgefrickel vor.
ziehe ich meistens die Verwendung dieser eigenem Rumgefrickel vor.
-
Ich gehe jetzt schlafen. Kann nicht mehr. Kopf dreht durch. Aber vielen herzlichen Dank für die Hilfen und das Ihr Zeit für mich genommen habt.