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));