memcpy auf char* und auf char[]



  • Hallo
    Ich weiß, es gibt hier schon 157 Beiträge zu Unterschieden zwischen char* und char[], konnte aber nicht in den ersten 10 einen Antwort und habe keine Zeit den rest durchzulesen - also frage ich mal mal zu 158en Mal.

    Wieso funktioniert

    char rString[] = "Ein Punkt mitten <wo> im Text";
    	char replace[] = "hier";
    	char* ptr = 0;
    
        ptr = strstr(rString, "<wo>");
    	memcpy(ptr, replace, strlen(replace));
    

    während rString als char* deklariert nicht funktioniert?

    So wie ich es sehe, passiert ja genau das gleiche - strstr bekomme ich die Adresse wo der String <wo> anfänget ( bei ausgabe habe ich dann in ptr "<wo> im Text" stehen. Dann sage ich "ersetze die nächsten 4 bytes ab der Adresse ptr mit "hier" ". Auch wenn rString als const char* bei char* = "xxx" declaration im Speicher vorliegt, ändert sich ja seine Adresse nicht dadurch - ich ersetze nur den Inhalt. -Auf jeden Fall versthe ich den unterschid nicht. Kann es mir einer erklären?

    btw. Was sollte ich machen wenn ich <wo> durch ein String mit z.B. 20 Buchstaqben ersetzen möchte, aber den Rest des Satzes ( also " im Text" )trotzdem behalten möchte, und zwar sodass es einfach hinter gerade eingefügten Bustaben steht im gleichen String?

    Danke



  • Hi,

    Feld schrieb:

    ...während rString als char* deklariert nicht funktioniert?

    weil ein son

    char* x = "sonstwas";
    

    Dingen in C immer nur gelesen werden darf (read only Speicherbereich). ⚠
    Mit der einen oder anderen Api Funktion lässt sich auch das umgehen, aber nicht mit C pur.
    Etwas anderes ist es, wenn du den Speicher so zuweist:

    char* x = malloc(30);
    

    Wenn malloc erfolgreich ist (wenn x != NULL ist), dann hast du 30 Bytes zur Verfügung, in die du schreiben darfst.

    Feld schrieb:

    btw. Was sollte ich machen wenn ich <wo> durch ein String mit z.B. 20 Buchstaqben ersetzen möchte, aber den Rest des Satzes ( also " im Text" )trotzdem behalten möchte, und zwar sodass es einfach hinter gerade eingefügten Bustaben steht im gleichen String?

    Danke

    Entweder das Feld groß genug wählen, oder einen char* Zeiger benutzen und die Größe anpassen.

    Gruß,
    B.B.



  • Feld schrieb:

    Wieso funktioniert

    char rString[] = "Ein Punkt mitten <wo> im Text";
    	char replace[] = "hier";
    	char* ptr = 0;
    
        ptr = strstr(rString, "<wo>");
    	memcpy(ptr, replace, strlen(replace));
    

    während rString als char* deklariert nicht funktioniert?

    weil bei 'char sting[] = "...";' die zeichen rechts vom = rüberkopiert werden (ein array wird angelegt und initialisiert). aber bei 'char *string = "...";' wird nur ein pointer angelegt (der dann auf einen read-only string zeigt). mehr passiert da nicht. jedes "..." im quelltext ist immer eine stringkonstante, die nur gelesen werden darf.
    🙂



  • Feld schrieb:

    ...

    btw. Was sollte ich machen wenn ich <wo> durch ein String mit z.B. 20 Buchstaqben ersetzen möchte, aber den Rest des Satzes ( also " im Text" )trotzdem behalten möchte, und zwar sodass es einfach hinter gerade eingefügten Bustaben steht im gleichen String?

    Danke

    char rString[100] = "Ein Punkt mitten <wo> im Text";
        char replace[] = "hierhierhierhierhier";
        char* ptr = 0;
    
        ptr = strstr(rString, "<wo>");
        memcpy(ptr+strlen(replace), ptr+strlen("<wo>"), ptr-rString);
        memcpy(ptr, replace, strlen(replace));
    

    :xmas1:



  • sorry, war ein Fehler drin, also richtig:

    char rString[100] = "Ein Punkt mitten <wo> im Text";
        char replace[] = "hierhierhierhierhier";
        char* ptr = 0;
    
        ptr = strstr(rString, "<wo>");
        memcpy(ptr+strlen(replace), ptr+strlen("<wo>"), strlen(ptr+strlen("<wo>")));
        memcpy(ptr, replace, strlen(replace));
    

    😃


Anmelden zum Antworten