String in String austauschen



  • Hi,

    Ich mächte einen String in einem String austauschen, zb.

    string "Hallo Maus";
    replace(string, "Maus", "Tastatur");
    
    Ausgabe: "Hallo Tastatur"
    

    Das ist nur ein frei erfunden beispiel, aber so in etwas sollte es sein. Ich habe bereits gegoogled und in der MSDN geschaut. Bin auch fündig geworden mit einer funktion namens CString::Replace, da ich aber in C und nicht in C++ programmiere weis ich nicht wie ich diese Classen verwenden kann, und ich möchte auch eigendlich in mein C programm kein C++ mit einbauen. Das wird ja dann ein totales durch einander. Allso meine frage: Gibt es auch in C eine Funktion die der CString::Replace in C++ ähnelt bzw den gleichen zweck erfühlt 😕

    MFG Hackepeter



  • Ist vielleicht nicht 100% das was du suchst, aber es funktioniert.
    Aber falls es andere Möglichkeiten gibt bin ich auch gerne offen *G*

    #include <string>
    
    using namespace std;
    
    int main()
    {
    	char a[13]= "Hallo Maus";
    
    	printf("%s\n",a);
    	strncpy(a+6, "Tastatur",10);
    
    	printf("%s\n",a);
    
    	return 0;
    }
    


  • Der arme Kerl wird sich über den Buffer Overflow aber freuen 😃
    Aber im Grunde wäre das schon mal ein Ansatz.



  • Hi!

    Mal sehen ob ich in meinem Zustand noch ne vernünftige Antwort hinbekomme. 🙄

    Wie schon gesagt erzeugt das was du machst BasicMan01 einen BufferOverflow. Da du keinen Speicher reservierst. Außerdem gibt es in C keine Namensbereiche.

    Versuche mal:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char* repl(char* x, const char* repl, const char* neu)
    {
    	char *pos=0, *tmp=0;
    	if((pos=strstr(x, repl))) *pos = '\0';
    	else return 0;
    	if(!(tmp = malloc(strlen(x)+strlen(neu)+1))) exit(1);
    	strcpy(tmp, x);
    	strcat(tmp, neu);
    	return tmp;
    }
    
    int main()
    {
    	char a[]= "Hallo Maus";
    
            char *x = repl(a, "Maus", "Tastatur");
    	printf("%s\n", x);
            free(x); /* Speicher freigeben */
        return 0;
    }
    

    Sieht zwar irgendwie scheiße aus und geht sicher besser, aber ist doch immerhin ein Anfang 🙂

    Code-Hacker



  • Danke für die schnellen Antworten.
    Dein Code, Code-Hacker, funktioniert gut. Aber wenn ich zum beispiel in dem String "Hallo Maus wie gehts?" das "Maus" mit "Tastatur" austausche, wir der rest des strings einfach abgeschnitten, und das ist so mein eigendliches problem.



  • Suchst du sowas?

    char * ersetze(char * ziel, char * quelle, const char * such, const char * ersetz)
    {
       char * hilf, * pos, * akt;
       int suchlen, ersetzlen, ziellen;
    
       *ziel = 0;
       suchlen = strlen(such);
       ersetzlen = strlen(ersetz);
    
       for(akt = quelle; (pos = strstr(akt, such)) != NULL; akt = pos + suchlen)
       {
          ziellen = strlen(ziel);
          strncat(ziel, akt, pos - akt);
          ziel[ziellen+pos-akt] = 0;
          strcat(ziel, ersetz);
       }
       strcat(ziel, akt);
    
       return(ziel);
    }
    

    Vielleicht sollte man auch noch was einbauen, dass einen Bufferoverflow bei ziel verhindert ;).



  • Hier ist eine Lösung, bei der der originalsatz erhalten bleibt.

    char* myReplace(char* alt,char* wort_alt,char* wort_neu)
    {
    	char* ptr;
    	char* neu;
    	ptr=strstr(alt,wort_alt);
    
    	neu=(char*)malloc(strlen(alt)-strlen(wort_alt)+strlen(wort_neu));
    	memcpy(neu,alt,ptr-alt);
    	memcpy(neu+(ptr-alt),wort_neu,strlen(wort_neu));
    	memcpy(neu+(ptr-alt)+strlen(wort_neu),ptr+strlen(wort_alt),ptr-alt+strlen(wort_alt));
    	return neu;
    }
    
    int main()
    {
    	char* satz="Hallo Welt Du";
    	char* satz_neu;
    	satz_neu=myReplace("Hallo, dies ist das Programm","das","ein");
    	printf(satz_neu);
    	return 0;
    }
    

    Vielleicht kannst du ja damit etwas anfangen...



  • @derBob
    Und wie machst du das bei dem Text

    "Hallo, dies ist das Programm, dass das Programm aufruft"

    (oder wenn noch viel mehr "das" drin sind?)

    Außerdem: Was ist mit dem Speicher, den du mit malloc() reserviert hast??



  • @AJ:
    Du hast richtig erkannt, dass

    1. nur ein Wort ausegtauscht werden kann
    2. free() vergessen wurde

    Danke.
    Sollte ich die Zeit finden, diese Fehler zu korrigieren, werde ich das selbstverständlich tun.



  • Hi!

    H@ckepeter schrieb:

    Danke für die schnellen Antworten.
    Dein Code, Code-Hacker, funktioniert gut. Aber wenn ich zum beispiel in dem String "Hallo Maus wie gehts?" das "Maus" mit "Tastatur" austausche, wir der rest des strings einfach abgeschnitten, und das ist so mein eigendliches problem.

    Hehe, darauf habe ich gar nicht geachtet, hast recht, sorry. Aber ich habe zuvor selbst 14,5h programmiert und somit nicht geschlafen. 🙂

    Code-Hacker



  • Eure Lösungen haben mich nicht ganz 100% zum Ziel geführt. Aber ich habe jetzt rotzdem eine Lösung gefunden:

    Ich habe mir die C++ Klassen funktion Replace() von CString in eine C funktion gepackt, und das ganze zu einer DLL gelinkt, die habe ich in mein Programm ein gebunden und kann jetzt bequem mit

    char * ReplaceString(char * Quelle, char * AltesWort, char * NeuesWort);
    

    beliebig viele Wörte in einem nazuh unbegrenzt langen String austauschen.

    Trozdem danke für eure Lösungen

    MFG Hackepeter


Anmelden zum Antworten