有没有办法使用strtok()以这种方式解析?如果不是strtok()还有其他方法吗?

时间:2016-01-21 15:07:22

标签: c parsing

我希望使用strtok()解析以下字符串。

DINNER;NME=Tom Johnson;ADRES=1234 Street;TIME="12:00","15:00":Formal

有没有办法可以在分隔符的左侧获得什么,并且在将该值存储到其他变量之后我希望删除该部分。

实施例: 因此,如果我在上面的字符串中选择分隔符为;。我希望DINNER存储在变量中,然后从我正在解析的字符串中删除DINNER。所以字符串现在看起来像这样:

NME=Tom Johnson;ADRES=1234 Street;TIME="12:00","15:00":Formal

反正我能做到吗?如果strtok()无法实现,我还能采取其他方式吗?

2 个答案:

答案 0 :(得分:2)

使用strpbrk()代替,例如

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

int main()
{
    char string[] = "DINNER;NME=Tom Johnson;ADRES=1234 Street;TIME=\"12:00\",\"15:00\":Formal";
    char *tail;
    char *token;

    token = string;
    while ((tail = strpbrk(token, ";:")) != NULL)
    {
        *tail++ = '\0';

        fprintf(stdout, "Token: `%s'\n", token);
        fprintf(stdout, "Right Side: `%s'\n", tail);

        token = tail;
    }

    return 0;
}

学习strpbrk() / strchr() / strstr()更好,因为strtok()有问题,例如无法同时解析多个字符串,或者将其与线程一起使用也是不可能的。

答案 1 :(得分:2)

第一次调用strtok时,它将返回指向第一个标记的指针。下一次指向下一个标记的指针。 E.g。

char *din = strtok(text, ";"); // "DINNER;NME=T  ...
char *nme = strtok(NULL, ";"); // "NME=Tom John  ...

请注意,您必须在第一次调用后传递NULL指针。这并不意味着字符串的第一部分被删除,您只需获得指向字符串另一部分的指针。此外,';'将替换为空终止字符。

如果您绝对想要“删除”第一部分,则必须复制要保留的部分。 E.g。

char *keep = strdup(nme);
free(text);