Strings Buchstaben vertauschen



  • @rustyoldguy
    Die getch()-Anweisung am Am Beginn der main.cpp ist da, um den User die Größe des Fensters bequem
    einstellen zu lassen.



  • Schrott - in jeder Hinsicht.
    Liebe Kinder, nicht nachmachen.



  • @codinglea sagte in Strings Buchstaben vertauschen:

    @DirkB
    Mit der Lösung kann ich ja aber nicht das 'en' mit dem 'x' tauschen... 🤔

    wenn du in ein anderes Array kopierst, geht das.

    Die Lösung für Sonderzeichen löschen steht schon da.



  • Die allgemeine Lösung sieht so aus:
    (im Gegensatz zu dem oben Schrott Genannten ist dieser Code strikt ANSI C konform und somit maximal portabel, läuft also auf allen Plattformen (gleich richtig)).
    Die Aufgabenstellung ist allerdings ebenso Schrott, die o.g. Einschränkungen im Fall für ersetzende Strings sind länger als zu ersetzende musst du unbedingt beachten, d.h. du musst selbst für ausreichend Speicher sorgen, wenn du inplace arbeiten willst.
    Ich zeige dir hier, wie man sowas macht, aber nur für deine Spielereien, im professionellen Geschäft macht man sowas natürlich nicht.

    #include <stdio.h>
    #include <string.h>
    
    char *strreplace(char *str,const char *from,const char *to)
    {
    	char *p=str;
    	while( p=strstr(p,from) )
    	{
    		memmove(p+strlen(to),p+strlen(from),strlen(p+strlen(from))+1);
    		memcpy(p,to,strlen(to));
    		p+=strlen(to);
    	}
    	return str;
    }
    
    int main()
    {
    	char x[64000]="hallo ende";
    	puts(strreplace(x,"en","enn"));
    	return 0;
    }
    

    https://ideone.com/wwoSZW



  • Vielen lieben Dank für eure Bemühungen!
    Mit dem Thema habe ich hier ja ganz schön Trubel aufgewirbelt. 😅
    Ich werde nun versuchen mit euren Antworten zu arbeiten. Ich berichte, welche Methode ich genommen habe!



  • @Wutz: strlen(to) und strlen(from) sollten aber einmalig vor der Schleife berechnet werden (sind ja invariabel innerhalb der Funktion).



  • @Wutz
    Die Lösung ist super, allerdings bekomme ich damit nur eine Tauschoption hin. ('en' zu 'x')
    Wie kriege ich zum Beispiel noch das 'x' zum 'en' umgewandelt?
    Wenn das klappt, bekomme ich ich auch die anderen Tauschoptionen hin.


  • Mod

    @codinglea sagte in Strings Buchstaben vertauschen:

    @Wutz
    Die Lösung ist super, allerdings bekomme ich damit nur eine Tauschoption hin. ('en' zu 'x')
    Wie kriege ich zum Beispiel noch das 'x' zum 'en' umgewandelt?
    Wenn das klappt, bekomme ich ich auch die anderen Tauschoptionen hin.

    Das wäre jetzt eigentlich der Teil, wo du selber zur Übung dran solltest. Wutzs Code sucht immer nach dem nächsten Vorkommen des zu Ersetzenden Strings (Zeile 7). Dann schiebt er passend zur Länge des Ersatzstrings umher (9), fügt das Ersatzwort ein (10) und geht um dessen Länge weiter für den nächsten Suchschritt (11->7).

    Wenn du nun mehrere zu suchende Wörter hast, musst du nach allen davon suchen, gucken, welches davon der nächstgelegene Treffer ist, und dann Wutzs Zeilen 9 bis 11 nachmachen, aber mit dem Ersatzwort das zu dem nächstgefundenen Suchwort passt.

    Dazu musst du dir auch überlegen, wie du überhaupt mehrere Such- und Ersatzwörter in die Funktion hinein bekommst. Bei nur zwei Paaren kann man das ja noch mit vier Parametern machen, aber mit jedem weiteren Paar wird nicht nur der Funktionsaufruf länger (und unflexibler), sondern auch der Code verzweigt sich dann in sehr viele Fallunterscheidungen. Wenn du also auch mehr als nur genau ein oder zwei Paare erlauben möchtest, dann wäre es besser, wenn man eine beliebige Anzahl von Paaren als ein Array von Paaren an die Funktion übergeben kann. Der Code ist dann auch nicht viel komplizierter als mit 4 Parametern für 2 Paare (vielleicht sogar ein bisschen einfacher…) und funktioniert dann für alle möglichen Kombinationen (sogar für 0 Paare, wenn du es richtig machst).



  • @codinglea Das Beispiel von Wutz zeigt, wie du Substrings ersetzen kannst, die unterschiedliche Länge haben.

    Du kannst in einer Schleife durch den String gehen und in einem switch (oder if-else-Kette) schauen, was bei den einzelnen Zeichen gemacht werden soll.
    Findest du ein 'e', dann musst du schauen ob das nächste Zeichen ein 'n' ist. Ist das so, ersetzten.
    Findest du ein 'x', dann musst du es durch "en" ersetzen.
    usw..

    Diese Lösung ist zwar nicht universell, führt aber erstmal zum Ziel.

    Wenn du dann weißt, wie man die Strings an die Funktion übergibst, dann kannst du ja umbauen.



  • @DirkB
    Mit switch wird das bei mir nichts...
    ich werde es mit der if-else-Kette ausprobieren.



  • @codinglea
    Du kannst alles in einem printf zusammenfassen.

     printf(strreplace(eingaben2,"en","x"),strreplace(eingaben2,"x","en"), strreplace(eingaben2,"er","q"),strreplace(eingaben2,"q","er"),strreplace(eingaben2,"ch","y"),strreplace(eingaben2,"y","ch"));
    

    "eingaben2" ist bei mir der String.
    Somit kannst du alles auf einmal ausgeben.



  • @Wutz
    Deine Lösung hat mir weitergeholfen!



  • @Luckyingmar
    Was glaubst Du denn, was herauskommt, wenn Du in einem String erst alle 'en' durch 'x' ersetzt - und danach alle 'x' durch 'en'?



  • @Luckyingmar
    Ja, genau. Das könnte man ganz einfach in die Lösung von Wutz einbauen.



  • @codinglea
    das ist doch klar
    @Wutz hat die optimale lösung geschaffen



  • Nein, auch die Lösung würde bei

    strreplace(eingaben2,"en","x");
    strreplace(eingaben2,"x","en");
    

    in eingaben2 wieder den Ursprungsstring liefern.

    Man muß schon Zeichen für Zeichen den String durchgehen und jeweils das Ersetzen einzeln durchführen (und dabei aber dann den Index (bzw. Zeiger) passend weiterbewegen).


  • Mod

    @Th69 sagte in Strings Buchstaben vertauschen:

    Nein, auch die Lösung würde bei

    strreplace(eingaben2,"en","x");
    strreplace(eingaben2,"x","en");
    

    in eingaben2 wieder den Ursprungsstring liefern.

    Nicht einmal das.

    strreplace(eingaben2,"en","x");
    strreplace(eingaben2,"x","en");
    

    ist äquivalent zu

    strreplace(eingaben2,"x","en");
    

    Man kann die geforderte Funktion nicht durch cleveres Aneinanderreihen einfacher Ersetzungen erreichen (außer wir machen ungerechtfertigte Annahmen darüber, dass gewisse Zeichen nicht vorkommen können). Man muss schon etwas eigenes schaffen, wie von mir oder @DirkB oben beschrieben. Das ist schließlich eine Programmieraufgabe, keine setze-Standardfunktionen-zusammen-Aufgabe.

    Nichtsdestotrotz ist das eine denkbar undankbare Aufgabenstellung, wenn man das in C machen möchte. Die Aufgabe ist ganz sicher nicht für C gedacht. Ich empfehle sehr, erst einmal etwas anderes zu machen. Man merkt deutlich, dass @codinglea nicht mehr so ganz mitkommt bei der Diskussion. Das bringt ihm am Ende dann ja keinen Lernerfolg, wenn einfach abgeschrieben wird.



  • @SeppJ
    *ihr wenn ich bitten darf!😀



  • @SeppJ: Hast natürlich recht - den Ursprungstext liefert er nur, wenn vorher kein "x" drin vorkommt (hatte mich auf den Code von @Wutz mit "hallo ende" bezogen).



  • Da es funktioniert hat, ist für mich die Aufgabe abgeschlossen.