【问题标题】:Tokenize a string with a specific multi-byte delimiter使用特定的多字节分隔符标记字符串
【发布时间】:2016-08-03 21:30:52
【问题描述】:

我需要像这样解析一个字符串:

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

输出应该是ablink:cd

但是使用strtok 的输出不稳定是abcdjh

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

【问题讨论】:

  • 在我看来,输入可能需要被解析为“link:b link:c”而不是“blink:c”。你确定你的要求吗?
  • 您的要求至少不清楚。如果您愿意,只需 link: 拆分字符串,然后 link:blink:c 将是并且应该是两个不同的标记。另一方面,如果您希望 `link:`(带有前导空格)分割字符串,那么第一个标记将是 link:a,因为它缺少前导空格。您可能应该澄清您真正想要的是什么。
  • @kaylum,我确定,它需要输出“blink:c”
  • @Dolda2000,我想我很清楚我想要什么。我想生成一个以第一个“链接:”开头的令牌,直到下一个空/空白空间

标签: c string token strtok


【解决方案1】:

回答我自己的问题。

基本上找到第一个链接:然后继续前进直到下一个空格/空,并在剩余的字符串上重复。

更好的方法是简单地使用 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);
    }

}

【讨论】:

    【解决方案2】:

    首先,将分隔符字符串传递给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 );
    }
    

    如果您需要比这更复杂的东西,请自己动手或使用正则表达式。

    【讨论】:

    • 嗨,你为什么要打印 printf( "%s\n", token + len_prefix ); ?我不明白连接这个的必要性。我的理解是,您是否已获得空间拆分标记,现在正在比较前 5 个字符是否等于链接:然后尝试打印其余部分.. 对吗?
    • 没错。前缀后面的字符串的其余部分从token + len_prefix 开始。那是指针算术,而不是串联。你可以用它做你想做的事。把它复制到某个地方或其他地方。在这种情况下,我只是将其打印到标准输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多