首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C中strtok函数是如何工作的?

在C中strtok函数是如何工作的?
EN

Stack Overflow用户
提问于 2014-01-14 01:11:46
回答 2查看 28.3K关注 0票数 26

我找到了这个解释strtok函数的示例程序:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main ()
{
    char str[] ="- This, a sample string.";
    char * pch;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    pch = strtok (str," ,.-");
    while (pch != NULL)
    {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
    }
    return 0;
}

然而,我不认为这是可行的。

pch = strtok (NULL, " ,.-");怎么可能返回一个新的令牌。我是说我们要和NULL一起给strtok打电话。这对我来说没有多大意义。

EN

回答 2

Stack Overflow用户

发布于 2014-01-14 01:13:18

strtok维护内部状态。当您使用非NULL调用它时,它会重新初始化自身以使用您提供的字符串。当您使用NULL调用它时,它使用该字符串,并且它当前获得的任何其他状态都将返回下一个令牌。

由于strtok的工作方式,如果您正在编写多线程应用程序,则需要确保链接到多线程版本的C运行时。这将确保每个线程为strtok获取自己的内部状态。

票数 4
EN

Stack Overflow用户

发布于 2014-01-14 01:16:12

strtok函数将数据存储在一个内部静态变量中,该变量在所有线程之间共享。

为了线程安全,您应该使用strtok_r

来自http://www.opensource.apple.com/source/Libc/Libc-167/string.subproj/strtok.c

看一看static char *last;

代码语言:javascript
复制
char *
strtok(s, delim)
    register char *s;
    register const char *delim;
{
    register char *spanp;
    register int c, sc;
    char *tok;
    static char *last;


    if (s == NULL && (s = last) == NULL)
        return (NULL);

    /*
     * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
     */
cont:
    c = *s++;
    for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
        if (c == sc)
            goto cont;
    }

    if (c == 0) {       /* no non-delimiter characters */
        last = NULL;
        return (NULL);
    }
    tok = s - 1;

    /*
     * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
     * Note that delim must have one NUL; we stop if we see that, too.
     */
    for (;;) {
        c = *s++;
        spanp = (char *)delim;
        do {
            if ((sc = *spanp++) == c) {
                if (c == 0)
                    s = NULL;
                else
                    s[-1] = 0;
                last = s;
                return (tok);
            }
        } while (sc != 0);
    }
    /* NOTREACHED */
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21097253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档