Основное отличие функций strtok и strtok_r заключается в их особенностях обработки строки:
- strtok разделяет строку на последовательность токенов, используя статический буфер. www.opennet.ru manpages.ubuntu.com При обработке строки её небезопасно использовать в программах со множеством процессов, работающих с одной областью памяти. www.opennet.ru
- strtok_r является реентрантной версией strtok и вместо статического буфера использует указатель типа char*, предоставленный пользователем. www.opennet.ru Этот указатель, передаваемый в параметре ptrptr, должен быть одним и тем же при обработке одной и той же строки. www.opennet.ru
Таким образом, strtok_r позволяет безопасно использовать функцию в потокобезопасных условиях, так как её можно вызывать из нескольких потоков одновременно или во вложенных циклах. stackoverflow.com