Eigene Funktion die Wörter aus nem String löscht



  • muss ne eigene Funktion in C++ schreiben, was 1 Wort aus einem String löscht.

    Aber irgendwie will das nicht, warum? Wie kriege ich das hin

    Danke

    int main()
    {
    char pText=(char) malloc(sizeof(char)*500);
    char pDelete=(char) malloc(sizeof(char)*500);

    cout << "Beliebigen Text eingeben: " <<endl;
    cin.getline(pText, 100);
    
    cout << "Was soll gelöscht werden: " <<endl;
    cin >> pDelete;
    
    while (*pText != '\0')
    {
    	if (*pText == *pDelete)
    	{
    		*pText = ' ';
    	}
    
    	pText++;
    	pDelete++;
    
    }
    
    cout << pText;
    
    
    _getch();
    return 0;
    

    }



  • @testettester sagte in Eigene Funktion die Wörter aus nem String löscht:

    Aber irgendwie will das nicht, warum?

    Hallo, das beschreibt dein Problem nicht wirklich.
    Zettel und Stift oder debugger wären sinnvoll. Deine 'Lösung' macht ehrlich gesagt nicht im Ansatz das, was es machen soll. Alleine schon, dass pText und pDelete immer gleich lang seien müssen, damit es wenigstens nicht knallt, sollte dir zu denken geben.

    Edit: Ok, knallen vielleicht nicht, da zufällig gleich gross, aber die Unsinnigkeit sollte dir trotzdem insbesondere an dieser Stelle auffallen.



  • @testettester sagte in Eigene Funktion die Wörter aus nem String löscht:

    char pText=(char) malloc(sizeof(char)*500);

    ???

    Benutze std::string und ein C++ Buch!



  • Hi,

    beschreib erst mal Deine Aufgabe etwas genauer.
    Sollst Du mit char-Feldern arbeiten um was zu lernen, dann so, ansonsten wie manni66 geschrieben hat mit strings.
    Aber mal zu Deiner Aufgabe, ist das erste Auftreten, oder jedes Auftreten zu löschen, sind nur ganze Wörter zu löschen, oder auch Teile eines größeren Wortes? Ist Gro-Kleinschreibung zu beachten...
    Viele Fragen, die sich stellen und nicht aus Deiner Beschreibung hervor gehen.
    Ich mache mal einen Pseudo-Quelltext-Vorschlag für alle ganzen Wörter im String:

    Fundstelle suchen, im Fehlerfall -1
    solange (Fundstelle > -1) und ((Fundstelle -1 = Trennzeichen) oder (Fundstelle = Anfang)) und >((Fundstelle + Länge(Suchwort) = Trennzeichen ) oder (Fundstelle + Länge(Suchwort) = Stringende))
    {
    Wort rauslöschen
    solange (Fundstelle <> Stringende) und (Fundstelle = Trennzeichen)
    {
    Zeichen rauslöschen
    wenn (Fundstelle = stringende)
    {
    solange(Fundstelle - 1 = Trennzeichen)
    {
    Fundstelle-- löschen
    }
    }
    }
    }

    Gruß Mümmel



  • Hi,

    ich bin auch nur Anfänger, also kann mein Lösungsvorschlag falsch bzw. umständlich sein. Aber bis jetzt bin ich (mit std::string) immer wie folgt vorgegangen:

    #include <iostream>
    #include <string>
    
    
    void cutStringPart(std::string& str, const std::string word) {
    	str.erase(str.find(word), word.size());
    }
    
    
    int main() {
    	
    	std::string str = "Heute ist ein warmer sonniger Tag";
    	cutStringPart(str, "warmer "); //Leerzeichen mit übergeben damit es ebenfalls entfernt wird
    
    	std::cout << str << std::endl;
    
    	return 0;
    }
    


  • Hi Zhavok

    ist sicher die eleganteste Lösung. Nur glaube ich nicht, ob erase dabei auch die Leerzeichen/Tabs... drumrum löscht. Ich vermute eher nicht immer, z.B. wenn danach 2 Leerzeichen kommen oder ein Tab...
    Außerdem hast Du keine Möglichkeit, dafür zu sorgen, dass zum Beispiel nur ganze Wörter gefunden und gelöscht werden. Die Version würde dann z.B. aus einem ofenwarm ein ofen machen, auch wenn das warm darin nicht gelöscht werden sollte. Die Brötchen sind dann nicht mehr ofenwarm sondern nur noch ofen...
    Da ich davon ausgehe, das Testettester das studiert oder lernt, wird der Lehrer wohl mehr erwarten, als die schnelle Form. Also im Prinzip so wie Du es angedeutet hast machen, aber den str.erase(str.find(word), word.size()) - Aufruf durch was eigenes ersetzen, welches den Rest mit erledigt. Also testet, wo es im Satz steht, und gegebenenfalls umgebende Leerzeichen/Tabs... mit anpassen, bzw. wenns am Anfang steht sogar aus dem ersten verbleibenden Buchstaben (wenns einer ist) einen Großbuchstaben machen.
    Es ist immer gut, sich zum einen auf die elegante kurze Lösung zu orientieren, aber auch die begleitenden Schmäckerchen als Luxusvariante anzubieten.

    Gruß Mümmel



  • @zhavok sagte in Eigene Funktion die Wörter aus nem String löscht:

    ich bin auch nur Anfänger, also kann mein Lösungsvorschlag falsch bzw. umständlich sein.

    Ja, mach mal

    cutStringPart(str, "gibts nich");
    

    Das ist dann nicht so gut.



  • Richtig, eine Abfrage wäre ganz sinnvoll. Allerdings scheitere ich selbst an einer sinnvollen Abfrage. Bis jetzt hab ich das so praktiziert:

    if (str.find(word) < std::numeric_limits<size_t>::max()) {}
    

    Das ist aber mit ziemlicher Sicherheit nicht der Weisheit letzter Schluss :smiling_face_with_open_mouth_cold_sweat:



  • @zhavok sagte in Eigene Funktion die Wörter aus nem String löscht:

    Richtig, eine Abfrage wäre ganz sinnvoll. Allerdings scheitere ich selbst an einer sinnvollen Abfrage. Bis jetzt hab ich das so praktiziert:

    if (str.find(word) < std::numeric_limits<size_t>::max()) {}
    

    Das ist aber mit ziemlicher Sicherheit nicht der Weisheit letzter Schluss :smiling_face_with_open_mouth_cold_sweat:

    "Return value
    Position of the first character of the found substring or npos if no such substring is found. " Quelle: https://en.cppreference.com/w/cpp/string/basic_string/find

    Was hindert dich also daran, es gscheid zu machen?

    VG



  • @zhavok Mmmh!?
    Mal auf die Idee gekommen, in die Doku zu schauen?

    Return Value
    The position of the first character of the first match.
    If no matches were found, the function returns string::npos.



  • Das wäre ja viel zu einfach. Don't read the manual :face_with_stuck-out_tongue_winking_eye:
    Habs mir direkt notiert^^



  • 1 Wort oder alle Vorkommen? Für letzteres hab ich mal eben das hier runter getippt:

    #include <algorithm>
    #include <string>
    #include <iostream>
    
    int main()
    {
    	std::string text;
    	std::string aboutToDelete;
    
    	std::cout << "Beliebigen Text eingeben: " << std::endl;
    	std::getline(std::cin, text);
    
    	std::cout << "Was soll gelöscht werden: " << std::endl;
    	std::getline(std::cin, aboutToDelete);
    
    	auto itr = std::begin(text);
    	while (itr != std::end(text))
    	{
    		itr = std::search(itr, std::end(text), std::begin(aboutToDelete), std::end(aboutToDelete));
    		if (itr != std::end(text))
    		{
    			auto last = itr;
    			std::advance(last, std::distance(std::begin(aboutToDelete), std::end(aboutToDelete)));
    			itr = text.erase(itr, last);
    		}
    	}
    
    	std::cout << text;
    	std::cin.get();
    	return 0;
    }
    

    Das wäre dann so der etwas modernere Ansatz statt dem Index gefummel.
    Derzeit ist die Suche case sensitive, das kann man natürlich auch noch ändern 😉



  • @dnkpp sagte in Eigene Funktion die Wörter aus nem String löscht:

    Das wäre dann so der etwas modernere Ansatz statt dem Index gefummel.

    Naja, darum geht es hier wohl eher nicht. Und wenn doch, dann wäre der moderne Ansatz das gar nicht selber zu schreiben, sondern z.B.:

     boost::replace_all("bar", "bla", "blubb");
    


  • @jockelx sagte in Eigene Funktion die Wörter aus nem String löscht:

    @dnkpp sagte in Eigene Funktion die Wörter aus nem String löscht:

    Das wäre dann so der etwas modernere Ansatz statt dem Index gefummel.

    Naja, darum geht es hier wohl eher nicht. Und wenn doch, dann wäre der moderne Ansatz das gar nicht selber zu schreiben, sondern z.B.:

     boost::replace_all("bar", "bla", "blubb");
    

    Ja, genau. STL ist out und dafür binde ich mir eine riesen dependency ala boost ans Bein. o.O
    zumal es wohl kaum schlecht sein kann, Anfänger etwas STL zu zeigen...



  • @dnkpp Du hast das ja ganz toll geschrieben. Wollte ich gar nicht schlecht machen. Interessiert den Fragesteller nur nicht und nein, Dinge die 100000mal programmiert wurden, programmiert man in der Regel nicht zum 1000001ten mal.
    Irgendwie hab ich das Gefühl, dass das so ein bisschen der Sinn von so Libraries ist.



  • @jockelx sagte in Eigene Funktion die Wörter aus nem String löscht:

    @dnkpp Du hast das ja ganz toll geschrieben. Wollte ich gar nicht schlecht machen. Interessiert den Fragesteller nur nicht und nein, Dinge die 100000mal programmiert wurden, programmiert man in der Regel nicht zum 1000001ten mal.
    Irgendwie hab ich das Gefühl, dass das so ein bisschen der Sinn von so Libraries ist.

    @testettester sagte in Eigene Funktion die Wörter aus nem String löscht:

    muss ne eigene Funktion in C++ schreiben, was 1 Wort aus einem String löscht.

    Vll ist mein Verständnis ja nicht so toll aber sagt der TE hier nicht explizit, dass er eine Funktion schreiben muss?

    Ich könnte ja deine Argumentation nachvollziehen, wenn ich alles im C Style geschrieben hätte aber den Aufriss mit aktuellen STL-Features?! Ich weiß ja nicht. Aber vielleicht ist dir ja die STL nicht genug Library...



  • @dnkpp sagte in Eigene Funktion die Wörter aus nem String löscht:

    Vll ist mein Verständnis ja nicht so toll aber sagt der TE hier nicht explizit, dass er eine Funktion schreiben muss?

    Ja, stimmt. Hab den Thread verwechselt, wo explizit nach low-level gefragt wurde.
    Der Rest bleibt bestehen. Ich hatte noch nie ein Projekt, wo keine fremd-libs genutzt wurden. Wäre ja auch bescheuert - auser man hat zuviel Geld und/oder Zeit.


Log in to reply