Pour comprendre comment strtok()
fonctionne, il faut d'abord savoir ce qu'est une variable statique . Ce lien l' explique assez bien ...
La clé du fonctionnement de strtok()
est de conserver l'emplacement du dernier séparateur entre les appels secondaires (c'est pourquoi strtok()
continue d'analyser la chaîne très originale qui lui est transmise lorsqu'elle est invoquée avec un null pointer
appel successif).
Jetez un œil à ma propre strtok()
implémentation, appelée zStrtok()
, qui a une fonctionnalité légèrement différente de celle fournie parstrtok()
char *zStrtok(char *str, const char *delim) {
static char *static_str=0; /* var to store last address */
int index=0, strlength=0; /* integers for indexes */
int found = 0; /* check if delim is found */
/* delimiter cannot be NULL
* if no more char left, return NULL as well
*/
if (delim==0 || (str == 0 && static_str == 0))
return 0;
if (str == 0)
str = static_str;
/* get length of string */
while(str[strlength])
strlength++;
/* find the first occurance of delim */
for (index=0;index<strlength;index++)
if (str[index]==delim[0]) {
found=1;
break;
}
/* if delim is not contained in str, return str */
if (!found) {
static_str = 0;
return str;
}
/* check for consecutive delimiters
*if first char is delim, return delim
*/
if (str[0]==delim[0]) {
static_str = (str + 1);
return (char *)delim;
}
/* terminate the string
* this assignmetn requires char[], so str has to
* be char[] rather than *char
*/
str[index] = '\0';
/* save the rest of the string */
if ((str + index + 1)!=0)
static_str = (str + index + 1);
else
static_str = 0;
return str;
}
Et voici un exemple d'utilisation
Example Usage
char str[] = "A,B,,,C";
printf("1 %s\n",zStrtok(s,","));
printf("2 %s\n",zStrtok(NULL,","));
printf("3 %s\n",zStrtok(NULL,","));
printf("4 %s\n",zStrtok(NULL,","));
printf("5 %s\n",zStrtok(NULL,","));
printf("6 %s\n",zStrtok(NULL,","));
Example Output
1 A
2 B
3 ,
4 ,
5 C
6 (null)
Le code provient d' une bibliothèque de traitement de chaînes que je gère sur Github , appelée zString. Jetez un œil au code, ou même contribuez :)
https://github.com/fnoyanisi/zString
strtok()
modifie sa chaîne d'arguments en terminant les jetons avec NUL avant de retourner. Si vous essayez d'examiner tout le tampon (str []), vous verrez qu'il est modifié entre les appels successifs àstrtok()
.