我的输入字符串是1,2,3:4,5,6:7,5,8 首先,我需要拆分1,2,3套机智:分隔符。然后我再次需要拆分1 2 3,分隔符。所以我需要做外部拆分和内部拆分直到输入字符串结束。请用一些例子解释我
答案 0 :(得分:3)
正如coderredoc所说,strtok
是你需要的功能。
#include <string.h>
char *strtok(char *str, const char *delim);
但strtok
有一些
你要记住的怪癖:
只有在第一次通话中,你才必须传递来源(str
)
必须使用strtok
NULL
的来电
Strtok
修改了来源。不要使用不可修改的字符串或字符串
文字("this is a string literal"
)
由于前一点,您应该始终复制该来源。
简单示例
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
const char *text = "Hello:World:!";
char *tmp = strdup(text);
if(tmp == NULL)
return 1; // no more memory
char *token = strtok(tmp, ":");
if(token == NULL)
{
free(tmp);
printf("No tokens\n");
return 1;
}
printf("Token: '%s'\n", token);
while(token = strtok(NULL, ":"))
printf("Token: '%s'\n", token);
free(tmp);
return 0;
}
预期输出
Token: 'Hello'
Token: 'World'
Token: '!'
<强>更新强>
如果您需要嵌套strtok
,则应使用前面提到的strtok_r
。
以下是我上面示例的更新。如果我没有弄错的话,input
会有
与你的格式相同(或多或少,我的设置尺寸不同,但原理相同)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
const char *input ="v1,v2,v3,v4,v5:w1,w2,w3,w4,w5:x1,x2,x3,x4:y1,y2,y3,y4,y5,y6";
char *input_copy = strdup(input);
char *set_track, *elem_track; // keep track for strtok_r
char *set, *value;
char *_input = input_copy;
int setnum = 0;
while(set = strtok_r(_input, ":", &set_track))
{
_input = NULL; // for subsequent calls of strtok_r
printf("Set %d contains: ", ++setnum);
// in this case I don't care about strtok messing with the input
char *_set_input = set; // same trick as above
while(value = strtok_r(_set_input, ",", &elem_track))
{
_set_input = NULL; // for subsequent calls of strtok_r
printf("%s, ", value);
}
puts("");
}
free(input_copy);
return 0;
}
预期输出
Set 1 contains: v1, v2, v3, v4, v5,
Set 2 contains: w1, w2, w3, w4, w5,
Set 3 contains: x1, x2, x3, x4,
Set 4 contains: y1, y2, y3, y4, y5, y6,