strtok_r是strtok的可重入变体。它符合POSIX标准。然而,在MinGW中缺少该函数,我正在尝试编译一个使用它的程序。
是否有任何方法可以添加标准实现此函数,也许是在项目的自身代码中或在MinGW的标准库函数中?
由于有关另一个答案中的代码许可问题,这里提供一个明确的公共领域许可证:
/*
* public domain strtok_r() by Charlie Gordon
*
* from comp.lang.c 9/14/2007
*
* http://groups.google.com/group/comp.lang.c/msg/2ab1ecbb86646684
*
* (Declaration that it's public domain):
* http://groups.google.com/group/comp.lang.c/msg/7c7b39328fefab9c
*/
char* strtok_r(
char *str,
const char *delim,
char **nextp)
{
char *ret;
if (str == NULL)
{
str = *nextp;
}
str += strspn(str, delim);
if (*str == '\0')
{
return NULL;
}
ret = str;
str += strcspn(str, delim);
if (*str)
{
*str++ = '\0';
}
*nextp = str;
return ret;
}
以下是源代码,您可以将其简单地添加到您的项目中的库/函数中:
char *strtok_r(char *str, const char *delim, char **save)
{
char *res, *last;
if( !save )
return strtok(str, delim);
if( !str && !(str = *save) )
return NULL;
last = str + strlen(str);
if( (*save = res = strtok(str, delim)) )
{
*save += strlen(res);
if( *save < last )
(*save)++;
else
*save = NULL;
}
return res;
}
MINGW没有strtok_r
的实现。但是您可以在下面的链接中找到一个线程安全的实现:
http://www.raspberryginger.com/jbailey/minix/html/strtok__r_8c-source.html
strtok
存储了一个静态分配的指向当前标记的指针。每次调用strtok
并传递一个非空的delim
时,都会初始化此指针,因此您可能会影响另一个同时使用strtok
的线程... 根据 OpenGroup 规范:“strtok() 函数不需要是可重入的。不需要是可重入的函数不需要是线程安全的”(http://pubs.opengroup.org/onlinepubs/009695399/functions/strtok_r.html)。如果我错了,请原谅。 - Claudistrtok
。实际上,strtok
是一个特殊情况,它使用了我评论中提到的静态分配指针的strtok_r
。 - Claudi