C 使用特定的多字节分隔符标记字符串

C 使用特定的多字节分隔符标记字符串,c,string,token,strtok,C,String,Token,Strtok,我需要解析如下字符串: 链接:a链接:闪烁:c链接:d lkjh 输出应为a,闪烁:c,d 但是使用strtok的输出可以理解为a,b,c,d,jh 如何确保仅link:显式拆分字符串(避免blink:c拆分的情况)。 另外,如何确保最后一个kjh不会出现(这里k似乎是分隔符)。首先,将分隔符字符串传递给strtok并不会像您所想的那样。如果传递“链接:”作为delim字段,它将使用这些字符中的任何一个作为分隔符。这就是拆分lkjh并返回jh的原因 最好按空格分隔,然后检查开头的匹配项“链接:”

我需要解析如下字符串:

链接:a链接:闪烁:c链接:d lkjh

输出应为
a
闪烁:c
d

但是使用strtok的输出可以理解为
a
b
c
d
jh

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

首先,将分隔符字符串传递给
strtok
并不会像您所想的那样。如果传递
“链接:”
作为
delim
字段,它将使用这些字符中的任何一个作为分隔符。这就是拆分
lkjh
并返回
jh
的原因

最好按空格分隔,然后检查开头的匹配项
“链接:


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

首先,将分隔符字符串传递给strtok并不会像您所想的那样。如果传递
“链接:”
作为
delim
字段,它将使用这些字符中的任何一个作为分隔符。这就是拆分
lkjh
并返回
jh
的原因

最好按空格分隔,然后检查开头的匹配项
“链接:


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

回答我自己的问题

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

更好的方法是简单地使用strstr:-

char* parseSubFn(char *string)
{


}回答我自己的问题

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

更好的方法是简单地使用strstr:-

char* parseSubFn(char *string)
{


}

在我看来,输入可能需要解析为“link:b link:c”,而不是“blink:c”。你确定你的要求吗?至少你的要求不清楚。如果你想,只需
link:
拆分字符串,那么
link:b
an
link:c
将是并且应该是两个不同的标记。另一方面,如果你想要`link:`(带前导空格)若要拆分字符串,则第一个标记将是
link:a
,因为它缺少前导空格。您可能应该澄清您真正想要的是什么。@kaylum,我确定,它需要输出“blink:c”@Dolda2000,我想我清楚我想要什么。我想生成一个以第一个“link:在下一个空空格之前,我认为输入可能需要解析为“link:b link:c”,而不是“blink:c”。你确定你的要求吗?至少你的要求不清楚。如果你想,只需
link:
拆分字符串,那么
link:b
an
link:c
将是并且应该是两个不同的标记。另一方面,如果你想要`link:`(带前导空格)若要拆分字符串,则第一个标记将是
link:a
,因为它缺少前导空格。您可能应该澄清您真正想要的是什么。@kaylum,我确定,它需要输出“blink:c”@Dolda2000,我想我清楚我想要什么。我想生成一个以第一个“link:在下一个空空格之前,为什么要打印printf(“%s\n”,token+len\u前缀)?我不理解将此连接起来的必要性。我理解的是,您已经获得了空间分割标记,现在正在比较前5个字符是否等于link:,然后尝试打印其剩余部分..对吗?对。前缀后面的字符串的剩余部分开始于
标记+len_前缀
。这是正确的s指针算术,而不是串联。你可以用它做任何你想做的事。把它复制到某个地方或任何地方。在这种情况下,我只是把它打印到标准输出。嗨,你为什么要打印printf(“%s\n”,token+len\u前缀)?我不理解将此连接起来的必要性。我理解的是,您已经获得了空间分割标记,现在正在比较前5个字符是否等于link:,然后尝试打印其剩余部分..对吗?对。前缀后面的字符串的剩余部分开始于
标记+len_前缀
。这是正确的s指针算法,不是串联。你可以用它做任何你想做的事情。把它复制到某个地方或任何地方。在这种情况下,我只是把它打印到标准输出。
    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);
    }