Importante: strtok
non è ri-entrante, si dovrebbe usare strtok_r
invece di esso.
Puoi farlo salvando una copia della stringa originale, e guardando in offset del token corrente in quella copia:
char str[] = "Hello there; How are you?/I'm good - End";
char *copy = strdup(str);
char *delim = ";-/";
char *res = strtok(str, delim);
while (res) {
printf("%c\n", copy[res-str+strlen(res)]);
res = strtok(NULL, delim);
}
free(copy);
Questo stampa
;
/
-
Demo #1
MODIFICA:Gestione di delimitatori multipli
Se è necessario gestire più delimitatori, determinare la lunghezza della sequenza corrente di delimitatori diventa leggermente più difficile: ora è necessario trovare il token successivo prima di decidere quanto è lunga la sequenza dei delimitatori.La matematica non è complicato, a patto che vi ricordate che NULL
richiede un trattamento speciale:
char str[] = "(20*(5+(7*2)))+((2+8)*(3+6*9))";
char *copy = strdup(str);
char *delim = "*+()";
char *res = strtok(str, delim);
while (res) {
int from = res-str+strlen(res);
res = strtok(NULL, delim);
int to = res != NULL ? res-str : strlen(copy);
printf("%.*s\n", to-from, copy+from);
}
free(copy);
Demo #2
Per info, quando l'uomo strtok: Questa interfaccia è obsoleto da strsep (3). – Geoffroy
No, ma se si fa una domanda per chiedere una versione che lo fa, qualcuno potrebbe scriverne uno. char * strtok_new (char * string, const char * delimiters, char * corrisponde); – Scooter
Si noti che 'strsep' non è in C o Posix (anche se' strtok_r' è in Posix e 'strtok_s' è in C11), ma è in LSB e BSD. Quindi 'strtok' è obsoleto da' strsep' su alcuni sistemi e non su altri. La cosa sulle pagine man è che si applicano solo al sistema in cui ti trovi quando usi 'man'. –