用C嵌套的strtok函数问题 [英] Nested strtok function problem in C

查看:113
本文介绍了用C嵌套的strtok函数问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的字符串:

  A; B,C,D组;ê
F;克; H;我;Ĵ
1; 2; 3; 4; 5

和我想通过元素分析它的元素。我用嵌套的strtok的功能,但它只是分裂第一线,使空令牌指针。我该如何克服这个问题?这里是code:

 令牌= strtok的(STR,\\ n);而(令牌= NULL&放大器;!&安培;!*记号= EOF)
{
    烧焦一个[​​128],B [128];
    的strcpy(一,令牌);
    的strcpy(B,A);
    的printf(A:%S \\ n,一);
    字符* token2 = strtok的(A,);
    而(token2!= NULL)
    {
        的printf(token2%S \\ n,token2);
        token2 =的strtok(NULL,);
    }
    的strcpy(令牌,B);
    令牌= strtok的(NULL,\\ n);
    如果(令牌== NULL)
    {
        的printf(空的);
    }
}

输出:

 标记2
令牌2 B
令牌2 C
令牌2天
令牌2ê


解决方案

您不能做到这一点与的strtok();使用 strtok_r() 从POSIX或 strtok_s() 从微软(如果有),或重新考虑你的设计。

 的char * strtok_r(字符*限制S,为const char *限制九月,
               焦炭**限制持续);
字符* strtok_s(字符* strToken,为const char * strDelimit,焦炭**背景);

这两个功能可以互换。虽然 strtok_s()是C11的可选部分(附件K在ISO / IEC 9899:2011),比微软其他一些供应商已经实现了标准的那部分接口

随着strtok_r()

 的#include<&string.h中GT;
#包括LT&;&stdio.h中GT;INT主要(无效)
{
    烧焦海峡[] =一个; B,C,D组;ê\\ NF;克; H,I; J□\\ n1的; 2; 3; 4; 5 \\ N的;
    字符* end_str;
    char *之令牌= strtok_r(STR,\\ n,&安培; end_str);    而(令牌!= NULL)
    {
        字符* end_token;
        的printf(A =%S \\ N标记);
        字符* token2 = strtok_r(令牌,;,&放大器; end_token);
        而(token2!= NULL)
        {
            的printf(B =%S \\ n,token2);
            token2 = strtok_r(NULL,;,&放大器; end_token);
        }
        令牌= strtok_r(NULL,\\ n,&安培; end_str);
    }    返回0;
}

结果

  A = A,B,C,D组;ê
B = A
B =
B = C
B =ð
B =Ë
A = F;克; H;我;Ĵ
B =˚F
B =摹
B = ^ h
B =
B =Ĵ
一个= 1; 2; 3; 4; 5
B = 1
B = 2
B = 3
B = 4
B = 5

无strtok_r()

这工作在背景 - 提供的数据以换行符结束

 的#include<&string.h中GT;
#包括LT&;&stdio.h中GT;INT主要(无效)
{
    CHAR数据[] =一个; B,C,D组;ê\\ NF;克; H,I; J□\\ n1的; 2; 3; 4; 5 \\ N的;
    字符*字符串=数据;
    字符*记号=和strchr(字符串,'\\ n');    而(令牌!= NULL)
    {
        / *字符串进行扫描是string..token * /
        *记号++ ='\\ 0';
        的printf(A =%S \\ n,字符串);
        字符* token2 = strtok的(字符串,);
        而(token2!= NULL)
        {
            的printf(B =%S \\ n,token2);
            token2 =的strtok(NULL,);
        }
        字符串=记号。
        令牌=和strchr(字符串,'\\ n');
    }    返回0;
}

输出

  A = A,B,C,D组;ê
B = A
B =
B = C
B =ð
B =Ë
A = F;克; H;我;Ĵ
B =˚F
B =摹
B = ^ h
B =
B =Ĵ
一个= 1; 2; 3; 4; 5
B = 1
B = 2
B = 3
B = 4
B = 5

I have a string like this:

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

and i want to parse it element by element. I used nested strtok function but it just splits first line and makes null the token pointer. How can i overcome this? Here is the code:

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

Output:

token 2 a
token 2 b
token 2 c
token 2 d
token 2 e

解决方案

You cannot do that with strtok(); use strtok_r() from POSIX or strtok_s() from Microsoft if they are available, or rethink your design.

char *strtok_r(char *restrict s, const char *restrict sep,
               char **restrict lasts);
char *strtok_s(char *strToken, const char *strDelimit, char **context); 

These two functions are interchangeable. Although strtok_s() is an optional part of C11 (Annex K in ISO/IEC 9899:2011), few suppliers other than Microsoft have implemented the interfaces in that section of the standard.

With strtok_r()

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

Results

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

Without strtok_r()

This works in context - provided that the data ends with a newline.

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

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

    while (token != NULL)
    {
        /* String to scan is in string..token */
        *token++ = '\0';
        printf("a = %s\n", string);
        char *token2 = strtok(string, ";");
        while (token2 != NULL)
        {
            printf("b = %s\n", token2);
            token2 = strtok(NULL, ";");
        }
        string = token;
        token = strchr(string, '\n');
    }

    return 0;
}

Output

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

这篇关于用C嵌套的strtok函数问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆