ß ersetzen durch "ss"


  • 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!



  • Th69, du hast keine Ahnung wovon du redest.
    Spreche nur über Dinge, von denen du Ahnung hast - also halte deine Klappe.



  • Oh, toll, ein Flamewar. Da mache ich auch mal mit. Bin ja so aufgeregt...
    Ach ne, besser doch nicht.



  • DocShoe schrieb:

    Oh, toll, ein Flamewar. Da mache ich auch mal mit. Bin ja so aufgeregt...
    Ach ne, besser doch nicht.

    Ist auch nicht interessant. Nur ein Spinner ohne Verstand und mit Langeweile, der alle anmacht. Gibt es hier eine Blockierfunktion für solche Trolle?


  • Mod

    Wenn nichts mehr Thema des OP gesagt werden soll, kann ich den Thread auch schliessen.



  • camper schrieb:

    Wenn nichts mehr Thema des OP gesagt werden soll, kann ich den Thread auch schliessen.

    Nur noch eins: Falls der OP meine Methode in Betracht zieht und einen Zeichensatz verwendet, in dem das 'ß' in ein einzelnes char passt, sollte die Speicherreservierung mindestes 2*strlen(inputstring) sein, weil für jedes ß zu ss ein Byte mehr benötigt wird.


Anmelden zum Antworten