was bedeutet dieser funktionsrumpf (pointer)
-
also eigentlich weiss ich nicht , warum dieses memmove() ein problem ist..
Bevor wir aber aneinander vorbeireden:
Dass es mit "hallo" nicht funktioniert weiss ich, das sagte ich ja auch.
aber mit "halloXY" funktioniert es ja auch nicht, solange ich memmove() drinstehen
habe.Ist &buf[i+2] nicht das Null-Terminierungs-Zeichen? Da müsste er doch drauf zugreifen können?!
BUFSIZE ist nicht explizit festgelegt, also nimmt er den Standard-Wert, der in C schon bereitgestellt ist oder?
Weiss auch nicht so genau, welcher Wert das ist...
-
Wenn du BUFSIZE in *buflen abänderst...
char buff[] = "peter12paul12mary"; char token[256] = ""; int bufflen = sizeof(buff); printf ("buff:%s\ntoken:%s\n", buff, token); getToken (token, buff, &bufflen, "12"); printf ("buff:%s\ntoken:%s\n", buff, token); getToken (token, buff, &bufflen, "12"); printf ("buff:%s\ntoken:%s\n", buff, token);
-
hi leprechaun.
hier meine ausgabe, wenn ich es so mache wie du sagtest:
buff:peter12paul12mary token: buff:paul12mary token:peter buff:mary token:paul Segmentation fault
es funktioniert so auch alles perfekt mit meinem programm, nur
dass nach allen ausgaben etc. noch ein segmentation fault da ist.
die funktion macht alles, was sie soll, und es klappt,
aber dann eben noch dieser segmentation fault.hast du eine Ahnung, weshalb ?
danke
-
hdi schrieb:
BUFSIZE ist nicht explizit festgelegt, also nimmt er den Standard-Wert, der in C schon bereitgestellt ist oder?
Weiss auch nicht so genau, welcher Wert das ist...Dann sag doch mal, was BUFSIZE ist, sonst sind das Annahmen und keine Fakten.
-
#include <stdio.h> #include <stdlib.h> int getToken(char *token, char *buf, int *buflen, char delimiter[3]) { int i; /* buf is too short to contain token, shortest token is delimiter */ if (*buflen < 2) return (-1); /* search buf for token-delimiter */ for (i = 0; i < *buflen -1; i++) { if (strncmp(&buf[i],delimiter,2)!=0) { token[i] = buf[i]; } else break; } /* if token not followed by delimiter, return error */ if ((strncmp(&buf[i], delimiter,2)!=0)) { token[0] = '\0'; return (-1); } /* null-terminate token and remove the found token from buf */ else { token[i] = '\0'; memmove(buf, (buf + i + 2), strlen(buf) - strlen(token) + 1); *buflen = strlen(buf); return (1); } } int main(void) { char strbuf[] = "peter12paul12mary"; char * pctoken; int ilaenge; ilaenge = strlen(strbuf); pctoken = calloc(256,sizeof(char)); printf("\nStart\n"); printf ("buff:%s\ntoken:%s\nlaenge:%d\n", strbuf, pctoken,ilaenge); printf("\nDurchlauf 1"); getToken (pctoken, strbuf, &ilaenge, "12"); printf ("\nbuff:%s\ntoken:%s\nlaenge:%d\n", strbuf, pctoken,ilaenge); printf("\nDurchlauf 2"); getToken (pctoken, strbuf, &ilaenge, "12"); printf ("\nbuff:%s\ntoken:%s\nlaenge:%d\n", strbuf, pctoken,ilaenge); free(pctoken); getchar(); return 0; }
:p Zeh Mau :p
-
hey,
okay also bufsize wird von ner headerdatei eingelesen und hat Wert 1024.soll das bedeutet, dass er zuviele bytes schreiben will und deshalb dann auf adressen zugreift, die gar nicht belegt sind?
-
..und dein beispiel mit calloc() habe ich gerade probiert, ändert aber nichts leider.
aber ich habe auch nicht die funktion verändert bei memmove(), da sie sicherlich korrekt ist.
-
hdi-logged out schrieb:
hey,
okay also bufsize wird von ner headerdatei eingelesen und hat Wert 1024.soll das bedeutet, dass er zuviele bytes schreiben will und deshalb dann auf adressen zugreift, die gar nicht belegt sind?
Aha, wieso so spät mit der Lösung??
Wenn ich das richtig interpretiere,memmove schreibt beginnend ab der Adresse von buf 1024 von (buf + i +2) ab.
Na wenn das mal nicht in die Hose geht: Segmentation fault!!!Zeh Mau
-
hdi schrieb:
..und dein beispiel mit calloc() habe ich gerade probiert, ändert aber nichts leider.
aber ich habe auch nicht die funktion verändert bei memmove(), da sie sicherlich korrekt ist.
Ich sage zur Funktion:
, die ist nicht ganz fehlerfrei!!!
-
Meine Ausgabe:
Start
buff:peter12paul12mary
token:
laenge:17Durchlauf 1
buff:paul12mary
token:peter
laenge:10Durchlauf 2
buff:mary
token:paul
laenge:4Zeh Mau
-
hey, okay also die funktion will ich nicht ändern, denn das war ja nur ein test von mir. anscheinend ist sie nicht für so kurze strings gedacht, und deshalb funktioniert halt mein beispiel nicht einwandfrei.
aber ich habe jetzt zumindest dank deiner hilfe verstanden, wie das ganze genau arbeitet.
vielen dank !!bis zum nächten mal
-
Gerne!
Zeh Mau