我希望使用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()
无法实现,我还能采取其他方式吗?
答案 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);