Pour comprendre comment strtok()
fonctionne, il faut d'abord savoir ce qu'est un variable statique est. Ce lien l'explique très bien....
La clé du fonctionnement de strtok()
préserve l'emplacement du dernier séparateur entre les appels seccessifs (c'est pourquoi strtok()
continue à analyser la chaîne de caractères originale qui lui a été transmise lorsqu'il est invoqué avec une commande de type null pointer
en appels successifs)..
Jetez un coup d'œil à mon propre strtok()
appelé zStrtok()
qui a une fonctionnalité légèrement différente de celle fournie par l'option strtok()
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 est tiré de une bibliothèque de traitement des chaînes de caractères que je maintiens sur Github appelé zString. Jetez un coup d'oeil au code, ou même contribuez :) https://github.com/fnoyanisi/zString