2013-06-27 10 views
6

Schleife über einen String str I verwendet:Verwenden strtok in einer for-Schleife

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

Ich möchte, wie diese Schleife Werke verstehen. Es scheint mir:

(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 

Ich würde mich über Ihre Hilfe freuen!

+4

Sie haben Recht auf alle drei zählt :) – dasblinkenlight

+0

Werfen Sie einen Blick auf die ** Related * * Fragen für weitere Details darüber, wie 'strtok()' funktioniert. Vor allem http://stackoverflow.com/questions/3889992/please-help-in-strtok?rq=1 – Barmar

+1

Der '* tok' Test ist nicht Teil der Standard-strtok Idiom. Es sieht so aus, als würde es früh auf einem leeren Feld anhalten, aber es wird nicht funktionieren, weil strtok leere Felder überspringt. –

Antwort

-1

, wenn Sie die manpages für strtok lesen heißt es

Die strtok() Funktion analysiert eine Zeichenfolge in eine Folge von Token. Unter sollte der erste Aufruf von strtok() der String, der analysiert werden soll, in str angegeben werden. In jedem nachfolgenden Aufruf, der dieselbe Zeichenfolge analysieren soll, sollte str NULL sein.

1

(2) tok = strtok (NULL, ";"); // Gehe zum nächsten Token in str? wie funktioniert das?

Genau so funktioniert strtok(). Indem Sie NULL als ersten Parameter senden, signalisieren Sie, dass strtok() mit der Zeichenfolge fortfahren soll, die während des letzten Aufrufs an ihn gesendet wurde. Wenn Sie die genauen Implementierungsdetails kennen möchten, müssen Sie sich den Quellcode für strtok() ansehen. Höchstwahrscheinlich verwendet es eine statische lokale Variable.

+1

Die Art und Weise, wie es funktioniert, ist in der Tat, dass es das erste Argument vom ersten Aufruf in einer privaten Variable entfernt. –

+0

Eigentlich hätte ich sagen sollen, dass Eichhörnchen das Ende des ersten Tokens/Start des nächsten Tokens wegjagen und dieses bei jedem Aufruf aktualisieren. –

-1

Hier finden Sie mehr über strtok. Es gibt einige Beispiele, wie man es benutzt.

aus dem Link Zitaten wird der Parameter in strstrtok(str, delim):

Beachten Sie, dass der Inhalt dieser Zeichenfolge modifiziert sind und in kleinere aufgebrochen Saiten (Tokens). Alternativ kann ein Nullzeiger angegeben werden. In diesem Fall fährt die Funktion mit dem Scannen fort, bei dem ein vorheriger erfolgreicher Aufruf der Funktion beendet wurde.

Ihre 3 Annahmen sind korrekt.

+0

Was ist falsch an dieser Antwort? – jh314

+0

Ich bin nicht der Downvoter, aber es kopiert nur, was das OP schrieb, außer für "wie funktioniert das?", Was es nicht beantwortet. –

+0

Danke !, ich werde es entsprechend bearbeiten. – jh314

4

Hier ist eine Probe strtok Umsetzung: http://bxr.su/o/lib/libc/string/strtok.c#strtok

Wie Sie im Code sehen, verwendet es einen statischen Charakter Zeiger intern (ziemlich jede Version Ich habe einen Zeiger gesehen speichern, entweder als globalen Variable oder als statische Variable wie im obigen Fall). Diese Version ruft den reentranten strtok_r (und der Nebeneffekt der Zeile if (s == NULL && (s = *last) == NULL) ist, den letzten Zeiger zu verwenden, wenn NULL übergeben wird)

+0

"so ziemlich jede Version, die ich gesehen habe" - es ist nicht möglich, es anders zu implementieren. –

Verwandte Themen