MinGW中的strtok_r函数

12

strtok_r是strtok的可重入变体。它符合POSIX标准。然而,在MinGW中缺少该函数,我正在尝试编译一个使用它的程序。

是否有任何方法可以添加标准实现此函数,也许是在项目的自身代码中或在MinGW的标准库函数中?

4个回答

15

由于有关另一个答案中的代码许可问题,这里提供一个明确的公共领域许可证:

/* 
 * 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;
}

2

以下是源代码,您可以将其简单地添加到您的项目中的库/函数中:

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;
}

1
这是你自己的本地实现还是来自于一个开源项目?如果是后者,它的使用是否有任何许可证? - simonc
libc源代码。这非常简单。任何人都可以在不查看源代码的情况下实现。我认为这没有任何许可证相关联。 - P.P
抱歉,如果我有点迟钝,但您有源链接吗?我认为它不太可能没有任何许可证就发布了,但我想我会被证明是错误的 :-) - simonc
据我所知,strtok 存储了一个静态分配的指向当前标记的指针。每次调用 strtok 并传递一个非空的 delim 时,都会初始化此指针,因此您可能会影响另一个同时使用 strtok 的线程... 根据 OpenGroup 规范:“strtok() 函数不需要是可重入的。不需要是可重入的函数不需要是线程安全的”(http://pubs.opengroup.org/onlinepubs/009695399/functions/strtok_r.html)。如果我错了,请原谅。 - Claudi
实际上,我在答案中发布的实现并没有使用 strtok。实际上,strtok 是一个特殊情况,它使用了我评论中提到的静态分配指针的 strtok_r - Claudi
显示剩余2条评论

1

FreeBSD实现对你有用吗?

它的许可证自由,但集成可能需要您的项目文档满足某些要求(添加一个包含已包括代码的确认)。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接