C++ Code wie umschreiben? (eigene String-Ersetz Funktion)
-
Vorweg: Ich MUSS mit Pointern arbeiten, darf keine vorgefertigten Funktionen oder ähnliches benutzen.
Ich versuche nach einem bestimmten Wort im Satz zu suchen und diesen durch x zu ersetzen. Wie mache ich das am besten? (Ich hätte es gerne in einer verschachtelten While-Schleife), also am besten auf mein Code beziehen
Danke
int main()
{
char text[100];
char entfern[100];
char *pText=text;
char *pEntfern=entfern;
int laenge1=0;
int laenge2;
cout << "Text eingeben: ";
cin.getline(text, sizeof(text));cout << "Welches Wort ersetzen?: "; cin.getline(entfern, sizeof(entfern)); laenge2=strlen(entfern)-1; while (*pText != '\0') { if (*pText == *pEntfern) { while (laenge1<laenge2) { *(pText)++; *(pEntfern)++; if (*pText == *pEntfern) { *pText='x'; } laenge1++; } } *(pText)++; } cout << text; _getch(); return 0;
}
-
@testettester sagte in C++ Code wie umschreiben? (eigene String-Ersetz Funktion):
Ich versuche nach einem bestimmten Wort im Satz zu suchen und diesen durch x zu ersetzen. Wie mache ich das am besten?
- Schreib dir eine Funktion, die ein Wort in einem anderen String sucht und dir dann die Adresse (char*) zurückgibt, wo das Wort zu finden ist (oder nullptr, wenn nicht vorhanden).
- Dann schreib dir eine Funktion, die einen bestimmten Abschnitt aus einem String herauslöschen kann.
- Kombiniere beides
(Ich hätte es gerne in einer verschachtelten While-Schleife)
Warum? Verschachtelungen machen Dinge unübersichtlich.
Und wenn du fertig bist, ersetze all deine char-Arrays durch std::string.
-
Zumal man da im schlimmsten Fall auch neu allokieren muss, wenn nämlich das gefundene Wort am Ende des Strings ist und das neue Replacement-Wort länger ist als das Such-Wort.
Wenn man alle möglichen Fälle berücksichtigen will und es nicht mit std::string machen will, ist das eine umfangreiche Aufgabe.
-
@It0101 Das Replacementwort ist "x" (in dieser Aufgabenstellung nicht variabel). Also ein Buchstabe lang. Das ist nie länger als ein anderes Suchwort (sofern man "" nicht als "Wort" zulässt). Denke daher nicht, dass das hier gefordert ist.
Meine Frage wäre vielmehr, wie man ein "Wort" erkennen soll. Also muss davor und danach (in Regex gesprochen) \b folgen? Wie erkenne ich eine Wortgrenze? Wie ist die Kodierung des Strings? Das wäre auch noch zu berücksichtigen. Ich wette aber, dass man das ignorieren soll.
-
Ist halt die Frage, welche Funktionen er nutzen darf? Vermutlich die aus ANSI-C-Headerfiles... also "strlen", "strncmp", etc.. ?
"Ohne alles" ist das ne ziemlich penetrante und zudem sinnlose Aufgabe. Zumal es in C++ ein Dreizeiler ist ( finden, entfernen, einfügen ). Mehr oder weniger.
Also kurzum: Der Professor/Lehrer nennt den Kurs "C++", verbietet dann aber alle C++-Bordmittel....
-
Das ist doch nahezu die gleiche Frage, wie die vorherigen 3 Threads:
https://www.c-plusplus.net/forum/topic/348183/wie-greife-ich-auf-ein-bestimmtes-pointer-index-zu
https://www.c-plusplus.net/forum/topic/348199/mehrere-elemente-aus-nem-char-array-ausgeben
https://www.c-plusplus.net/forum/topic/348248/eigene-funktion-die-wörter-aus-nem-string-löschtSchön zu sehen, dass all die Hilfe aus diesen Threads so gut angekommen ist [/s]
-
Hab mein Code jetzt so umgeschrieben:
int main()
{
char text[100];
char entfern[100];
char *pText=text;
char *pEntfern=entfern;cout << "Text eingeben: "; cin.getline(text, sizeof(text)); cout << "Welches Wort loeschen?: "; cin.getline(entfern, sizeof(entfern)); while (*pText != '\0') { while (*pText == *pEntfern) { *pText=' '; *(pText)++; *(pEntfern)++; if (*pText == '\0') { break; } } *(pText)++; } cout << text; _getch(); return 0;
}
Wenn ich aus "Was machst du heute" das Wort du mit ' ' ersetzen will, dann geht es, aber wenn ich z.B. "Was machst denn du heute" stehen habe (Es geht darum dass vor dem du auch ein Wort mit "d" steht also das denn), dann wird das d mit einem Leerstring ersetzt, was nicht passieren darf. Wie überprüfe ich ob alles was in text steht auch in entfern steht UND ERST DANACH es mit einem leerstring ersetzt wird?
danke
P.S Ich MUSSSS aus Übungszwecken mit Pointern arbeiten.
-
@testettester Liest du eigentlich die Tipps oder wartest du auf eine fertige Lösung?
Ich wiederhole meine Tipps gerne:
- Schreib dir eine Funktion, die ein Wort in einem anderen String sucht und dir dann die Adresse (char*) zurückgibt, wo das Wort zu finden ist (oder nullptr, wenn nicht vorhanden).
- Dann schreib dir eine Funktion, die einen bestimmten Abschnitt aus einem String herauslöschen kann.
- Kombiniere beides (und lösche ein Zeichen weniger als das Suchwort lang ist und ersetzte das übrige Zeichen durch 'x')
-
@wob Danke, aber ich würde es so machen wie bei mir
-
@testettester sagte in C++ Code wie umschreiben? (eigene String-Ersetz Funktion):
@wob Danke, aber ich würde es so machen wie bei mir
Selber schuld.
-
@testettester sagte in C++ Code wie umschreiben? (eigene String-Ersetz Funktion):
@wob Danke, aber ich würde es so machen wie bei mir
Damit senkst du die Wartbarkeit des Quellcodes auf ~0. Das ist zwar am Anfang nicht ganz so wichtig, aber wenn man mal gescheite Software basteln will, sollte man besten solche Macken gar nicht erst einschleifen. Macht es später einfacher.
Das beste sind immer klar abgegrenzte eindeutige Funktionen, die genau eine Sache tun, die man im Idealfall direkt am Funktionsnamen erkennt.
-
Ich MUSS das aus Testzwecken machen und nicht anders
-
Tja dann...
Aber noch ein paar Tipps:
- warum hast du
*(pText)++;
geschrieben (es macht zwar das erwartet richtige, aber man schreibt es einfacher)? - du änderst in der Schleife jeweils die Zeiger - überlege dir was dabei geschieht, wenn die Schleifen weiterlaufen
- warum hast du