2013-06-27 14 views
6

Per loop su una stringa str ho usato:Usa strtok in un ciclo for

for (tok = strtok(str, ";"); tok && *tok; tok = strtok(NULL, ";")) 
{ 
    //do stuff 
} 

Vorrei capire come funziona questo ciclo. Mi sembra:

(1) tok = strtok(str, ";"); //initialization of tok with the first token in str  
(2) tok = strtok(NULL, ";"); // go to the next token in str? how does this work? 
(3) tok && *tok; //this stops the loop when tok =NULL or *tok=NULL 

Gradirei il vostro aiuto!

+4

Hai ragione su tutti e tre i conteggi :) – dasblinkenlight

+0

Dai un'occhiata a ** Related * * domande per maggiori dettagli su come 'strtok()' funziona. Specialmente http://stackoverflow.com/questions/3889992/please-help-in-strtok?rq=1 – Barmar

+1

Il test '* tok' non fa parte dell'idioma standard di strtok. Sembra che voglia fermarsi presto su un campo vuoto, ma non funzionerà perché strtok salta i campi vuoti. –

risposta

-1

se si legge la manpages per strtok si afferma

Lo strtok() funzione analizza una stringa in una sequenza di token. Su la prima chiamata a strtok() deve essere specificata la stringa da analizzare in str. In ogni chiamata successiva che dovrebbe analizzare la stessa stringa, lo str dovrebbe essere NULL.

1

(2) tok = strtok (NULL, ";"); // vai al prossimo token in str? come funziona?

Questo è esattamente il modo in cui funziona strtok(). Inviando NULL come primo parametro, si segnala che strtok() deve continuare con la stringa che è stata inviata durante l'ultima chiamata. Se si desidera conoscere i dettagli esatti dell'implementazione, è necessario consultare il codice sorgente per strtok(). Molto probabilmente utilizza una variabile locale statica.

+1

Il modo in cui funziona è infatti che allontana il primo argomento dalla chiamata iniziale in una variabile privata. –

+0

In realtà, avrei dovuto dire che scoiattoli via la fine del primo token/inizio del prossimo token e lo aggiorna ad ogni chiamata. –

-1

Potete trovare maggiori informazioni su strtok qui. Ha alcuni esempi su come usarlo.

Citando dal link, il parametro str in strtok(str, delim):

Si noti che il contenuto di questa stringa vengono modificati e suddivisi in più piccole stringhe (tokens). In alternativa, è possibile specificare un puntatore nullo, nel qual caso la funzione continua la scansione in cui è terminata una precedente chiamata riuscita alla funzione.

Le tue 3 ipotesi sono corrette.

+0

Cosa c'è di sbagliato in questa risposta? – jh314

+0

Non sono il downvoter, ma duplica semplicemente ciò che l'OP ha scritto, eccetto per "come funziona?", A cui non risponde. –

+0

Grazie !, lo modificherò di conseguenza. – jh314

4

Ecco un esempio di implementazione strtok: http://bxr.su/o/lib/libc/string/strtok.c#strtok

Come si può vedere nel codice, si utilizza un puntatore a carattere statico internamente (praticamente tutte le versioni che ho visto memorizzare un puntatore, o come una variabile globale o come variabile statica come nel caso precedente). Questa versione chiama il rientro strtok_r (e l'effetto collaterale della riga if (s == NULL && (s = *last) == NULL) consiste nell'utilizzare l'ultimo puntatore se viene passato NULL)

+0

"praticamente tutte le versioni che ho visto" - non è possibile implementarlo diversamente. –