我有这样的字符串:
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
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_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;
}
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