What's the difference between strtok and strtok_r in C?
strtok
is equivalent to (and often defined as):
char *strtok(char *str, const char *delim) {
static char *save;
return strtok_r(str, delim, &save);
}
in general, you should use strtok_r
directly rather than strtok
, unless you need to make your code portable to pre-POSIX-2001 systems that only support strtok
The _r
versions of functions are reentrant: you can call them from multiple threads simultaneously, or in nested loops, et cetera. Reentrant versions usually take an extra argument, this argument is used to store state between calls instead of using a global variable.
The non-reentrant versions often use global state, so if you call them from multiple threads, you are probably invoking undefined behavior. Your program could crash, or worse.
From the man pages (man 3 strtok
):
The
strtok_r()
function is a reentrant version ofstrtok()
. The context pointer last must be provided on each call. Thestrtok_r()
function may also be used to nest two parsing loops within one another, as long as separate context pointers are used.
strtok
save static pointer for reuse in the next time, when you give NULL as the first parameter, so you just can't parse 2 strings in parallel.
In the strtok_r
you give also the pointer, as out parameter (pointer to pointer). so there is no static pointer in the function and you can move from one string to another and back...