使用特定的多字节分隔符对字符串进行标记

时间:2016-04-13 02:14:27

标签: c string token strtok

我需要解析这样的字符串:

link:a link:blink:c link:d lkjh

输出应为ablink:cd

但使用strtok的输出结果是abcdjh

如何确保只有link:显式拆分字符串(避免blink:c被分割的情况。 另外,我如何确保最后kjh没有出现(k似乎是这里的分隔符)。

2 个答案:

答案 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);
    }

}