String zuschneiden
-
Hallo!
Wie kann man das erste Zeichen eines Strings abschneiden?
ich habe zwei Variablen vom typ char*
char* str1="Xhallo" char* str2=""
und uch möchte das in str2 nur hallo steht..
mfg
ralf
-
Hi!
Wenn du den selben Speicher benutzen willst, wo "XHallo" bereits drinsteht, mußt du str2 nur auf str1 + 1 zeigen lassen:
str2 = str1 + 1;
Wenn str2 einen eigenen Bereich im Speicher haben soll, dann so:
str2 = strdup(str1 + 1);
Cya, dynamite.
-
????????
char *str1="Xhallo"; char *str2=""; // warum nicht gleich char *str2; ? // wenn auf str2 das selbe stehen soll wie auf str1: str1=str2+1; // wenn aber eine der variablen dann verändert wird, ändert sich auch die 2.!!! weil sie nur ein pointer auf den selben string wie die erste ist // bei dem volgendem programmausschnitt sollte für eine 2. Variable genügend speicher reserviert werden, und anschliesend der Inhalt kopiert. // dh. die Variablen beeinflussen einander nicht automatisch free(str2); str2=(char *) malloc( strlen(str1) ); strcpy(str2,str1+1);
mfG (c)h
Edit1: Tippfehler in strcpy
Edit2: erstes zeichen weglassen & sizeof(char) berücksichtigen
-
@chille07:
Dein Aufruf von free() ist falsch.sizeof(char) ist immer 1
Dein doppelter Aufruf von strcpy ist ebenfalls falsch.
Außerdem hast du dir die Angabe des OP wohl nicht ganz durchgelesen, denn sonst hättest du bemerkt, dass er das 1. Zeichen abschneiden will.
-
thanx, dass du mich auf einige sachen aufmerksam gemacht hast.. habe meinen beitrag editiert
ich wüsste jedoch nicht, was am "free" falsch sein soll...
void free( void * );
-
Du kannst free nicht benutzen, wenn du vorher den Speicher reserviert hast, und das tust du nicht. Erst nach *str2=(char ) malloc( strlen(str1) ); (und es sollte strlen(str1)+1 sein wegen \0) darfst du free benutzen. Sonst bekommst du eine Fehlermeldung oder stürtzt dein Programm ab.
edit: ok, hab gesehen, dass du ein zeichen wegnehmen willst, dann passt schon nur strlen(str1)
-
supertux schrieb:
Du kannst free nicht benutzen, wenn du vorher den Speicher reserviert hast, und das tust du nicht. Erst nach *str2=(char ) malloc( strlen(str1) ); (und es sollte strlen(str1)+1 sein wegen \0) darfst du free benutzen. Sonst bekommst du eine Fehlermeldung oder stürtzt dein Programm ab.
edit: ok, hab gesehen, dass du ein zeichen wegnehmen willst, dann passt schon nur strlen(str1)
wird nicht durch das:
char *str2="";
gleich speicher reserviert?
ich würde sagen, dass durch diese zuweisung der compiler automatisch ein '\0' erzeugt, was zur folge hätte, dass doch schon speicherplatz reserviert worden wäre... und wenn man diesen speicherbereich freigibt, kann man später malloc verwenden.. ansonsten wäre doch realloc an der reihe oder?mfG (c)h
-
chille07 schrieb:
wird nicht durch das:
char *str2="";
gleich speicher reserviert?
Aber nicht auf dem Heap. Mit free() wird lediglich auf dem Heap allokierter Speicher wieder freigegeben.
Darum
char* p = (char*) malloc(...);
free(p); // richtigchar* p = "foo";
free(p); // falsch
-
chille07 schrieb:
wird nicht durch das:
char *str2="";
gleich speicher reserviert?
ich würde sagen, dass durch diese zuweisung der compiler automatisch ein '\0' erzeugt, was zur folge hätte, dass doch schon speicherplatz reserviert worden wäre... und wenn man diesen speicherbereich freigibt, kann man später malloc verwenden.. ansonsten wäre doch realloc an der reihe oder?mfG (c)h
Das ist komplett falsch. Was char* ptr2=""; macht eine Variable von Typ char* anlegen, die auf die Zeichenkette "" zeigt, dynamisch wurde Speicher nicht reserviert. Wenn der Speicher dynamisch reserviert wird, wie mit malloc/realloc, dann wird der Speicher auf eine andere Stelle abgelegt (auf den Heap und nicht uaf den Stack), nachdem das Programm/Funktion abgearbeitet wurde, wird der Speicher gelöscht, aber nur den Speicher, den man nicht dynamisch angelegt hat (also nur der Stack wird geleert). D.h. der Speicher von malloc/realloc, der auf einer anderen Stelle liegt (Heap), bleibt unberührt, deshalb benutzt man free, weil free nur dynamisch angelegte Speicher freigeben kann.
Ich rate dir, es genauer mit einem Buch zu lernen, weil das wichtig ist.
-
supertux schrieb:
chille07 schrieb:
wird nicht durch das:
char *str2="";
gleich speicher reserviert?
ich würde sagen, dass durch diese zuweisung der compiler automatisch ein '\0' erzeugt, was zur folge hätte, dass doch schon speicherplatz reserviert worden wäre... und wenn man diesen speicherbereich freigibt, kann man später malloc verwenden.. ansonsten wäre doch realloc an der reihe oder?mfG (c)h
Das ist komplett falsch. Was char* ptr2=""; macht eine Variable von Typ char* anlegen, die auf die Zeichenkette "" zeigt, dynamisch wurde Speicher nicht reserviert. Wenn der Speicher dynamisch reserviert wird, wie mit malloc/realloc, dann wird der Speicher auf eine andere Stelle abgelegt (auf den Heap und nicht uaf den Stack), nachdem das Programm/Funktion abgearbeitet wurde, wird der Speicher gelöscht, aber nur den Speicher, den man nicht dynamisch angelegt hat (also nur der Stack wird geleert). D.h. der Speicher von malloc/realloc, der auf einer anderen Stelle liegt (Heap), bleibt unberührt, deshalb benutzt man free, weil free nur dynamisch angelegte Speicher freigeben kann.
Ich rate dir, es genauer mit einem Buch zu lernen, weil das wichtig ist.
Nein, das war nicht komplett falsch. Es wird in der Tat Speicher reserviert - nur eben nicht auf dem Heap.
nachdem das Programm/Funktion abgearbeitet wurde, wird der Speicher gelöscht, aber nur den Speicher, den man nicht dynamisch angelegt hat (also nur der Stack wird geleert).
So wie du es formuliert hast ist es nicht richtig. Jedes vernünftige OS wird nach der Programmterminierung automatisch den vom Prozess allokierten SPeicher wieder freigeben.
-
interpreter schrieb:
Nein, das war nicht komplett falsch. Es wird in der Tat Speicher reserviert - nur eben nicht auf dem Heap.
das habe ich auch so gemeint, vielleicht habe ich mich falsch ausgedruckt.