What\'s the difference between strtok
and strtok_r
in C
and when are we supposed to use which?
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.