为什么 strtok 函数会一个接一个地忽略两个标记

Why the strtok function ignores two tokens one after the other

我有一个代码将我的 char str[] 拆分为标记:

void my_function(char str[])
{   
    int i = 0;
    char *p = strtok(str, "/");
    char *rows[SIZE] = { NULL };

        while(p==NULL)
        {
            rows[i++] = p;
            p = strtok(NULL, "/");
        }
}

2个token('/')依次保存token顺序有问题

示例:“abc/a//bb”

(SIZE=4)

行数=['abc','a','bb',null]

我希望结果是:

rows=['abc','a',null,'bb'](保存token的顺序)

我该如何解决这个问题?

是的,那是strtok()的行为。传递给 strtok() 的标记通常由某种空格分隔,当分隔符为空格时,这是用户的期望。

要克服,实现你自己的分词器。

char *tokenize(char *s, char t, char **ctx)
{
    if (s) *ctx = s;
    if (!*ctx) return NULL;
    s = *ctx;
    if (!*s) return NULL;
    while (**ctx) {
       if (**ctx == t) {
           **ctx = 0;
           ++*ctx;
           return NULL;
       }
       ++*ctx;
    }
    return s;
}

strtok 为您提供由 1 个或多个定界字符的字符串分隔的标记,因此根据定义,您不能获得空标记。如果您希望标记由单个字符定界符分隔,请改用 strsep。不幸的是,这仅在 BSD 和 Linux 系统上可用,但很容易自己编写:

char *strsep(char **stringp, const char *delim) {
    char *rv = *stringp;
    if (rv) {
        *stringp += strcspn(rv, delim);
        if (**stringp)
            *(*stringp)++ = '[=10=]';
        else
            *stringp = NULL;
    }
    return rv;
}