To understand how strtok()
works, one first need to know what a static variable is. This link explains it quite well....
The key to the operation of strtok()
is preserving the location of the last seperator between seccessive calls (that's why strtok()
continues to parse the very original string that is passed to it when it is invoked with a null pointer
in successive calls)..
Have a look at my own strtok()
implementation, called zStrtok()
, which has a sligtly different functionality than the one provided by 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;
}
And here is an example usage
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)
The code is from a string processing library I maintain on Github, called zString. Have a look at the code, or even contribute :)
https://github.com/fnoyanisi/zString
strtok()
modifies its argument string by terminating tokens with NUL before returning. If you try to examine the whole buffer (str[]) you'll see it being modified between successive calls tostrtok()
. – Whatleystr
, watchstr[0]
,str[1]
,str[2]
, ... – Cammycamomile"xxxxxxhello"
and make a pointer (pch
) point to the'h'
, the 'x's are as good as inexistent (as long as I access the string throughpch
) – CammycamomileNULL
. This obviously makes it not thread safe, only one tokenization can be active at a time. Reference – Tamarind