在C中拆分复杂的字符串

Har*_*cos 4 c string split

好的,所以我需要做的是分割一个字符串.这是我需要拆分的示例字符串:

test_french_fries
Run Code Online (Sandbox Code Playgroud)

并且假设我想将字符串分成两部分,前后部分:

french

因此我会得到一些回报:

match[1]=[test_]
match[2]=[_fries]
Run Code Online (Sandbox Code Playgroud)

我试过搞乱,strtok()但我没有成功.似乎strtok()将字符串拆分为给定的所有delim - 所以如果我要给它一个delim french,它会为匹配的每个字符分隔字符串 - 这不是我想要的.

我想要一个delim,我可以在其中提供str或char*,例如"french",并在提供的字符串之前和之后拆分字符串.

除了strtok()我可能尝试实现以实现我期望的结果之外还有其他方法吗?

我非常感谢我收到的任何和所有帮助.

-Patrick

Hav*_*ard 5

strtok()只能使用单个符号作为分隔符(1个字符)进行拆分,您可以以空终止字符串的形式指定多个分隔符,但它们是单独的.要将另一个字符串拆分为分隔符,您必须编写自定义函数.下面的示例就像strtok(),但使用以null结尾的C字符串作为分隔符:

#include <stdio.h>

char *strstrtok(char *src, char *sep)
{
    static char *str = NULL;
    if (src) str = src;
    else src = str;

    if (str == NULL)
        return NULL;

    char *next = strstr(str, sep);
    if (next)
    {
        *next = '\0';
        str = next + strlen(sep);
    }
    else
        str = NULL;

    return src;
}

int main(void) {
    char buf[] = "yoursepmamasepissepsosepfatsepsheseptooksepasepspoonseptosepthesepsuperbowl";
    char *token = strstrtok(buf, "sep");
    while (token)
    {
        printf("%s ", token);
        token = strstrtok(NULL, "sep");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意strtok(),此解决方案不是线程安全的.

看看它在Ideone上工作:http://ideone.com/cjRGgJ

  • 最好使用`strtok_r`作为模型并采用额外的`save`指针,而不是使用非重入/线程安全的静态变量... (2认同)