我需要解析这样的字符串:
link:a link:blink:c link:d lkjh
输出应为a
,blink:c
,d
但使用strtok
的输出结果是a
,b
,c
,d
,jh
如何确保只有link:
显式拆分字符串(避免blink:c
被分割的情况。
另外,我如何确保最后kjh
没有出现(k似乎是这里的分隔符)。
答案 0 :(得分:4)
首先,将分隔符字符串传递给strtok
并不能达到您的想象。如果您将"link:"
作为delim
字段传递,则会使用这些字符中的任何作为分隔符。这就是lkjh
被拆分并返回jh
。
最好按空格分割,然后检查开头是否匹配"link:"
。
const char * delim = " ";
const char * prefix = "link:";
const size_t len_prefix = strlen( prefix );
char * token = strtok( input_string, delim );
while( token != NULL ) {
if( 0 == strncmp( token, prefix, len_prefix )
{
printf( "%s\n", token + len_prefix );
}
token = strtok( NULL, delim );
}
如果你需要比这更复杂的东西,请自己动手或使用正则表达式。
答案 1 :(得分:0)
回答我自己的问题。
基本上找到第一个链接:然后继续前进到下一个空格/ null,并重复字符串残余。
更好的方法是简单地使用strstr: -
char* parseSubFn(char *string)
{
if(string==NULL || *string=='\0')
return;
else{
//printf("Parsing on %s \n",string);
const char* needle = "link:";
char ret[128];//large buffer character for return token
char *location=strstr(string,needle);
char *start=location+5;
int i=0;
while(*start!='\0' && *start!='\n' && *start!=' ')
{
ret[i]=*start;
start++;i++;
}
start++;
printf("%s\n",ret);
parseSubFn(start);
}
}