zwei strtok's schachteln ?
-
hallo,
ich habe folgendes gemacht:Das ist der ursprungstext:
....
First Page|0|2
Second Page|10|32
....Der Ursprungstext kommt als Recource aus einer dll und liegt daher in form von
*pText vor.ich will nun jeweils die "Zeile" bis zum "\n" mittels token einlesen.
das klappt auch.das ergebnis ist folgendes: token -> First Page|0|2
von token will ich nun den text bis zum ersten "|" erhalten, also "First Page".
dazu habe ich die folgende schleife geschrieben:char *pText; //Das ist der ursprungstext
char *token;
char *token2;for (int i = 0; i <= PageCount-1;i++)
{
token = strtok(NULL,"\n"); //NULL beabsichtigt, da vorher etwas anderes
token2 = strtok(token,"|");
strcpy(Liste[i].Caption,token2);
}leider schmeisst mit hir token2 "0" anstatt "Second Page" raus. Die Null stammt von der "First Page"
kann man nicht zwei strtok mischen ?
grüsse
rml
-
RML schrieb:
kann man nicht zwei strtok mischen ?
ich glaube nicht, weil strtok ja seinen pointer braucht, den es weiterzählt.
char * strtok(char * s, const char * delims) { static char * str = NULL; // <<- der darf nicht static sein ! if (s != NULL) str = s; if (str == NULL) return NULL; if (delims == NULL) { s = str; str = NULL; return s; } // first skip initial delims.... while (1) { if (*str == '\0') { str = NULL; return NULL; } if (strchr(delims, *str) == NULL) break; ++str; } // *str is not '\0' and not in delims. s = str; // find next char in delims. do { if (*++str == '\0') { str = NULL; return s; } } while (strchr(delims, *str) == NULL); *str++ = '\0'; return s; }
eventuell geht eine eigene strtok-funktion, die den pointer irgendwo sichert.
-
uU bietet dein Compiler ein strtok_r an?
strtok_r ist kein C++ Standard, aber POSIX - deshalb kann es dein Compiler vielleicht.
strtok_r ist eine Threadsafe Version von strtok - sie arbeitet nicht mit einem statischen puffer und kann deshalb auch 'geschachtelt' aufgerufen werden...
-
hm ich nutze VC++ Net 2002
falls ich da jetzt nicht irgendeinen header brauchen sollte, kennt er "strtok_r" wohl nicht.
ich werde also am besten eins temporäres char* Array erzeugen, was jeweils eine zeile enthält, diese dann mit einer zweiten schleife durchlaufen, die namen dann mit token2 extrahieren und das array dann wieder löschen...
schade, danke euch aber für die schnelle antwort
-
Wenn du mit C++ arbeitest, verwende doch boost::tokenizer.
mfg JJ