ß ersetzen durch "ss"


  • Mod

    Ich sehe mehrere Fehler:
    - Nicht der Aufrufer sollte dafür verantwortlich sein, den Zielstring vernünftig zu terminieren. Das ist Aufgabe deiner Funktion.
    - Du veränderst den Quellstring! Das ist garantiert nicht im Sinne der Aufgabenstellung. Du schreibst auch potentiell über das Ende hinaus, was ganz schlimm ist, denn es ist ja nicht garantiert dass der Quellstring genug Platz für das Ergebnis hat.



  • Hmm, also ich bin schon mal sehr happy, dass ich es bisher mal geschrieben habe. Aber wie hätte ich es den ändern sollen?


  • Mod

    Schreib direkt in den Zielstring, anstatt die Quelle zu manipulieren und dann am Ende zu kopieren.

    Zur allergrößten Not kopier erst die Quelle ins Ziel und verändere dann das Ziel auf die Art und Weise, wie du derzeit die Quelle veränderst. Wobei diese Vorgehensweise ziemlich umständlich wäre, besser wäre es, gleich die richtigen Daten ins Ziel zu schreiben.

    Guck dir noch einmal an, wie Zeichenketten in C funktionieren. Die müssen immer mit '\0' abgeschlossen sein und es ist deine Verantwortung, wenn du eine Zeichenkette erstellst, dass das auch passiert. Hier hingegen überschreibst du die terminierende Null mit einem Leerzeichen, wodurch dann das Ende nicht mehr richtig erfasst werden kann.

    A propos Leerzeichen: Deine Funktion kommt nach wie vor nicht damit zurecht, wenn das 'ß' nicht von einem Leerzeichen gefolgt wird. Probier's mal aus!



  • AAAAAAAAA, maaaaaaan. Dieses scheiß Zeug. Warum mache ich das überhaupt!!!!!!!!!!!!!!!!! Keine Ahnung. Ist jedes mal anders. Kapiere es einfach nicht. Warum muss es immer so kompliziert seien.



  • Also ich habe jetzt das hier fabriziert. Ist bestimmt wieder falsch aber sieht besser aus, als das Original.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void Replace(char* dest, const char* src, const char* old, const char *new);
    
    int main(void){
    	char src[3072] = "Das ist eine faß faß Beute.";;
    	char dest[3072] = "";
    	char old[] = "ß";
    	char new[] = "ss";
    	Replace(dest, src, old, new);
    	puts(dest);
    
    	return 0;
    }
    
    void Replace(char* dest, char* src, const char* old, const char *new){
    	char *origin = src;
    	char *pos = strstr(src, old);
    	while (pos)
    	{
    		strncpy(dest, src, pos - src);
    		dest += pos - src;
    		dest += sprintf(dest, "ss", old);
    		src = pos;
    		src += strlen(old);
    		pos = strstr(src, old);
    		origin = src;
    	}
    	strcpy(dest, origin);
    }
    

    Das Problem ist jetzt, dass die Vorgabe der Deklaration ist, dass char* src als const ist. Wenn ich das const wegnehme, dann läuft es, Wenn ich const lasse kommt ein fehler.

    ICH BITTE UM HILFE(((((((


  • Mod

    Das ist ja auch komplett richtig, dass src ein const char* sein soll. Schließlich sollst du ihn nicht ändern! Wenn der Compiler sich beschwert, dann hat er Recht. Beschwert er sich in Zeile 20? Dann weil natürlich auch jede Kopie von src die const-Auszeichnung haben muss, sonst könnte man ja einfach über diese Hintertür das Original ändern.

    In Zeile 26 hast du statt new das "ss" fest eingebaut.



  • Bitte könnte mir jemand diesen Code korrigieren?



  • Setze doch einfach an den 2 Stellen wo du es vergessen hast noch ein "const" hin?

    void Replace(char* dest, const char* src, const char* old, const char *new){
    

    Beim ersten helfe ich dir.

    // EDIT:

    Mich wundert allerdings dass es läuft, da die Deklaration der Methode mit "const char src*" von der eigentlichen Methodensignatur abweicht.

    PS: "const" kann man auch innerhalb von Methoden für Variablen verwenden.
    PPS: Warum kopierst du überhaupt src noch einmal auf "origin"?

    // Next EDIT:
    Und falls du wirklich nicht selbst auf die Lösung kommst. Schau hier rein IDEONE.


  • Mod

    snboy2010 schrieb:

    Wenn ich const lasse kommt ein fehler.

    Das wollen wir in diesem Forum so gut wie nie wissen.
    Was wir wissen wollen, ist welchen Fehler du bekommst. Und das soll dann bitte auch keine Fehlerbeschreibung sein, sondern 1:1 Zeichen für Zeichen genau das, was der Compiler dazu zu sagen hat.

    Evtl. benutzt du einen C++-Compiler? Dann muss nat. auch pos const char* sein, wenn src es ist.
    Und origin sowieso.



  • Ich habe es auch mal probiert. Ohne Änderung wird es dir nicht helfen, weil bei mir sind Sonderzeichen in UTF8. Bei mir tut es das so.

    Aber falls es euch interessiert:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char *makeSS (char *in)
    {
        char *mem = malloc (strlen(in)+1);  
        if (!mem)
            return 0;
        char *out;
        for (out = mem; *in; in++)
        {
            if (*in == -61 && *(in+1) == -97)  // entspricht: if (*in == 'ß')
            {
                *out++ = 's';
                *out++ = 's';
                in++;  // nur nötig bei UTF8
            }
            else
            {
                *out++ = *in;
            }
        }
        *out = 0;
        return mem;
    }
    
    int main()
    {
        char *out = makeSS ("Faß Faß faß faß");
        puts (out);
        free (out); // speicher wieder freigeben
    }
    


  • snboy2010 schrieb:

    while (pos)
    	{
    		strncpy(dest, src, pos - src);
    		dest += pos - src;
    		dest += sprintf(dest, "ss", old);
    }
    

    Nur Deppen benutzen strncpy.
    Was soll das sprintf hier bewirken?
    Genau - Schrott.

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    char *strreplace(char *out,const char *in,const char *old,const char *new); 
    
    int main(void){ 
        const char *in = "Das ist eine faß faß Beute.", *old = "ß", *new = "ss";
        char out[1000];
        puts(strreplace(out,in,old,new)); 
        return 0; 
    } 
    
    char *strreplace(char *out,const char *in,const char *old,const char *new){ 
    	strcpy(out,in);
        // Anfänger sollten immer for benutzen, while ist was für Profis 
        for(char *pos = strstr(out, old); pos!=NULL; pos = strstr(out, old)) 
        { 
            memmove(pos+strlen(new),pos+strlen(old),strlen(pos+strlen(old))+1); /* Restverschiebung */
            memcpy(pos,new,strlen(new));
        }
        return out;
    }
    

    http://ideone.com/vbApZD



  • covfefe schrieb:

    char *makeSS (char *in)
    {
        char *mem = malloc (strlen(in)+1);
    ...
    }
    
    int main()
    {
        char *out = makeSS ("Faß Faß faß faß");
        ...
    }
    

    Und was soll dieser Müll?


  • Mod

    Wutz schrieb:

    char *strreplace(char *out,const char *in,const char *old,const char *new){ 
    	strcpy(out,in);
        // Anfänger sollten immer for benutzen, while ist was für Profis 
        for(char *pos = strstr(out, old); pos!=NULL; pos = strstr(out, old)) 
        { 
            memmove(pos+strlen(new),pos+strlen(old),strlen(pos+strlen(old))+1); /* Restverschiebung */
            memcpy(pos,new,strlen(new));
        }
        return out;
    }
    

    Toll. Gleich dafür gesorgt, dass sich die Leute wieder schnellere Computer leisten müssen.
    Ist ja nur Anfängercode, algorithmische Komplexität ist egal und es werden sowieso blossß triviale Beispiele untersucht... 🙄



  • Camper, halt einfach die Klappe.



  • Wutz schrieb:

    covfefe schrieb:

    char *makeSS (char *in)
    {
        char *mem = malloc (strlen(in)+1);
    ...
    }
    
    int main()
    {
        char *out = makeSS ("Faß Faß faß faß");
        ...
    }
    

    Und was soll dieser Müll?

    Müll ist es weil du es verstümmelt hast, Kumpel.



  • Durchschaubarer Versuch, deinen offensichtlichen Unsinn auch noch detailliert zu erklären.


  • Mod

    Wutz schrieb:

    snboy2010 schrieb:

    while (pos)
    	{
    		strncpy(dest, src, pos - src);
    		dest += pos - src;
    		dest += sprintf(dest, "ss", old);
    }
    

    Nur Deppen benutzen strncpy.
    Was soll das sprintf hier bewirken?

    Ja klar, nur Deppen benutzen strncpy, aber herauszufinden, was der Author mit dem sprintf beabsichtigt haben könnte, ist nat. für selbst für hochintelligente Personen nicht herauszufinden, folglich kann auch keine hilfreicher Kommentar abgegeben werden...



  • Wutz schrieb:

    Durchschaubarer Versuch, deinen offensichtlichen Unsinn auch noch detailliert zu erklären.

    Ein gestörter Pöbler wie du kann offensichtlich gar nichts erklären.



  • snboy2010 schrieb:

    AAAAAAAAA, maaaaaaan. Dieses scheiß Zeug. Warum mache ich das überhaupt!!!!!!!!!!!!!!!!! Keine Ahnung. Ist jedes mal anders. Kapiere es einfach nicht. Warum muss es immer so kompliziert seien.

    Dein Gejammer nervt einfach nur noch.

    snboy2010 schrieb:

    Bitte könnte mir jemand diesen Code korrigieren?

    Kannst du wirklich GAR nix selbst?! Eine Klausur die DU bestehst, besteht auch Lukas Podolski...



  • Wutz, such dir ein anderes Hobby, denn professionell C programmieren kannst du anscheinend nicht.
    Und deine Kommentare kannst du dir (und uns) bitte ersparen!


Anmelden zum Antworten