C中的嵌套strtok函数问题[重复]

问题描述 投票:15回答:2

我有这样的字符串:

a;b;c;d;e
f;g;h;i;j
1;2;3;4;5

并且我想逐个元素解析它。我使用了嵌套的strtok函数,但它只是分割第一行并使标记指针为null。我该如何克服呢?这是代码:

token = strtok(str, "\n");

while(token != NULL && *token != EOF)
{
    char a[128], b[128];
    strcpy(a,token);
    strcpy(b,a);
    printf("a:%s\n",a);
    char *token2 = strtok(a,";");
    while(token2 != NULL)
    {
        printf("token2 %s\n",token2);
        token2 = strtok(NULL,";");
    }
    strcpy(token,b);
    token = strtok(NULL, "\n");
    if(token == NULL)
    {
        printf("its null");
    }
}

输出:

token 2 a
token 2 b
token 2 c
token 2 d
token 2 e
c nested token tokenize strtok
2个回答
26
投票
strtok_s()

这两个功能可以互换。

请注意,在C11的可选部分(ISO / IEC 9899:2011中的附录K)中指定了变体strtok_s()。但是,除Microsoft之外,几乎没有其他供应商在标准的该部分中实现了接口。附件K中指定的char *strtok_r(char *restrict s, const char *restrict sep,
               char **restrict lasts);
char *strtok_s(char *strToken, const char *strDelimit, char **context); 
版本具有与Microsoft的strtok_s()不同的界面-附件K中指定的许多其他功能都存在类似的问题。

使用strtok_r()

strtok_s()

结果
strtok_s()

没有strtok_r()

这在上下文中有效-前提是数据以换行符结尾。

strtok_s()

输出

#include <string.h>
#include <stdio.h>

int main(void)
{
    char str[] = "a;b;c;d;e\nf;g;h;i;j\n1;2;3;4;5\n";
    char *end_str;
    char *token = strtok_r(str, "\n", &end_str);

    while (token != NULL)
    {
        char *end_token;
        printf("a = %s\n", token);
        char *token2 = strtok_r(token, ";", &end_token);
        while (token2 != NULL)
        {
            printf("b = %s\n", token2);
            token2 = strtok_r(NULL, ";", &end_token);
        }
        token = strtok_r(NULL, "\n", &end_str);
    }

    return 0;
}

4
投票
a = a;b;c;d;e b = a b = b b = c b = d b = e a = f;g;h;i;j b = f b = g b = h b = i b = j a = 1;2;3;4;5 b = 1 b = 2 b = 3 b = 4 b = 5

输出:

strtok_r
© www.soinside.com 2019 - 2024. All rights reserved.