for-Schleife für Pointer

sberger

Grünschnabel
Hallo,
ich hätte da eine Frage bezüglich eines Codeteils, welchen ich nicht wirklich verstehe.
Und zwar geht es um folgened for-Schleife:

Code:
char *str = "das soll in token zerlegt werden";
char *p_str;
    for (p_str = str; ;p_str = NULL)  
    {  
        token = mystrtok(p_str,delim);  
        if (token == NULL)  
            break;  
        printf("\n: %s",token);  
    }

Denn vollständigen Code dazu gibts auf: http://simplestcodings.blogspot.com/2010/08/custom-string-tokenizer-in-c.html

Für mich ist nich ganz klar wodurch mehrere token ausgegeben werden können, wenn pstr nie durchlaufen wird?! Kann man das gleiche auch mit einer anderen Schleifenform realisieren. Ich habs mit einer while() probiert, dann wird aber nur der erste token endlos ausgegben.


Ich wär für Ratschläge wirklich dankbar...
LG
 
Bei deiner for-Schleife fehlt eine Initialisierung der Zählvariable, sowie deren Incremen-oder Decrementierung.
Na klar funktioniert das auch mit einer while-Schleife; funktioniert mit jedem Schleifentyp in C.
schau dir am besten noch einmal an wie Schleifen funktionieren - deren Syntax und poste deine while-Schleife, sowie eine richtige for-Schleife. Wenn wir das geklärt haben, dann klären wir die Pointer-Arithmetik.

MFG
 
Für mich ist nich ganz klar wodurch mehrere token ausgegeben werden können, wenn pstr nie durchlaufen wird?!
pstr wird durchlaufen. Aber nicht durch die Schleife sondern durch die Anwendung von strtok (bzw. mystrtok in diesem Fall).

Es ist eine etwas ungewöhnliche Anwendung von strtok bzw. der for Schleife, da in jedem Schleifendurchlauf p_str immer wieder auf NULL gesetzt wird.

Allerdings funktioniert strtok eben genau so: erstmal mit einem String ungleich NULL aufrufen und dann immer NULL als ersten Parameter übergeben um über die restlichen Token zu iterieren. Letztlich wird die Schleife abgebrochen wenn strtok NULL zurück gibt.

Äquivalent:
C:
for (token = mystrtok(str, delim); token != NULL; token = mystrtok(NULL, delim)) {
  printf (..., token);
}
Gruß
 
Zurück