问题 stGok_r为MinGW


strtok_r 是strtok的可重入变体。符合POSIX标准。但是,MinGW缺少它,我正在尝试编译正在使用它的程序。

有没有什么办法可以添加这个函数的标准实现,可能是项目自己的代码,还是MinGW的标准库函数?


6500
2017-10-19 13:12


起源



答案:


由于有一些关于来自另一个答案的代码的许可证问题,这里是一个明确的公共领域:

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

12
2017-10-19 17:23





这是您可以简单地添加到项目中自己的库/函数的源代码:

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

2
2017-10-19 13:20



这个实现不是线程安全的,是吗? - Claudix
这是strtok_r的标准实现。如果 str 是堆上然后这是线程安全的。 - P.P.
期望str在堆上是否合理?意义,是规范的要求部分吗? - sashoalm
是的,如果你想要线程安全。 - P.P.
这是您自己的本地实现还是来自开源项目?如果是后者,是否有与其使用相关的许可证? - simonc


答案:


由于有一些关于来自另一个答案的代码的许可证问题,这里是一个明确的公共领域:

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

12
2017-10-19 17:23





这是您可以简单地添加到项目中自己的库/函数的源代码:

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

2
2017-10-19 13:20



这个实现不是线程安全的,是吗? - Claudix
这是strtok_r的标准实现。如果 str 是堆上然后这是线程安全的。 - P.P.
期望str在堆上是否合理?意义,是规范的要求部分吗? - sashoalm
是的,如果你想要线程安全。 - P.P.
这是您自己的本地实现还是来自开源项目?如果是后者,是否有与其使用相关的许可证? - simonc


是个 FreeBSD实现 对你有用吗?

它自由许可但集成它可能对您的项目文档有一些要求(添加一个包含代码的确认)。


1
2017-10-19 13:21





MINGW没有实施 strtok_r。但是,您可以在以下链接中找到线程安全的实现:

http://www.raspberryginger.com/jbailey/minix/html/strtok__r_8c-source.html


1
2017-10-19 13:27