按子字符串拆分字符串

Split string by a substring

我有以下字符串:

char str[] = "A/USING=B)";

我想拆分以获得单独的 AB 值,并以 /USING= 作为分隔符

我该怎么做?我知道 strtok() 但它只是用一个字符作为分隔符。

正如其他人指出的那样,您可以使用 <string.h> 中的 strstr 来查找字符串中的分隔符。然后复制子字符串或修改输入字符串以将其拆分。

这是 returns 拆分字符串的第二部分的实现。如果字符串无法拆分,则returns NULL,原字符串不变。如果需要将字符串拆分成更多的子串,可以重复调用尾部的函数。第一部分将是输入字符串,可能会缩短。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *split(char *str, const char *delim)
{
    char *p = strstr(str, delim);

    if (p == NULL) return NULL;     // delimiter not found

    *p = '[=10=]';                      // terminate string after head
    return p + strlen(delim);       // return tail substring
}

int main(void)
{
    char str[] = "A/USING=B";
    char *tail;

    tail = split(str, "/USING=");

    if (tail) {
        printf("head: '%s'\n", str);
        printf("tail: '%s'\n", tail);
    }

    return 0;
}

参见this。我在 google.

上搜索你的问题时得到了这个

在你的情况下它将是:

#include <stdio.h>
#include <string.h>

int main (int argc, char* argv [])
{
    char theString [16] = "abcd/USING=efgh";
    char theCopy [16];
    char *token;
    strcpy (theCopy, theString);
    token = strtok (theCopy, "/USING=");
    while (token)
    {
        printf ("%s\n", token);
        token = strtok (NULL, "/USING=");
    }

    return 0;
}

这使用 /USING= 作为分隔符。

这个输出是:

abcd                                                                                                                                                                                                                      
efgh 

如果你想检查,你可以通过here在线编译运行它。

I known strtok() but it just split by one character as delimiter

不,不是。

根据 man page strtok(),(强调我的

char *strtok(char *str, const char *delim);

[...] The delim argument specifies a set of bytes that delimit the tokens in the parsed string. [...] A sequence of two or more contiguous delimiter bytes in the parsed string is considered to be a single delimiter. [...]

因此,它不必是您提到的 “一个字符”。您可以使用一个字符串,就像您的情况 "/USING=" 作为分隔符来完成工作。

这里有一个小函数可以做到这一点。它的工作方式与 strtok_r 完全相同,只是分隔符被视为分隔字符串,而不是分隔字符列表。

char *strtokstr_r(char *s, char *delim, char **save_ptr)
{
    char *end;
    if (s == NULL)
        s = *save_ptr;

    if (s == NULL || *s == '[=10=]')
    {
        *save_ptr = s;
        return NULL;
    }

    // Skip leading delimiters.
    while (strstr(s,delim)==s) s+=strlen(delim);
    if (*s == '[=10=]')
    {
        *save_ptr = s;
        return NULL;
    }

    // Find the end of the token.
    end = strstr (s, delim);
    if (end == NULL)
    {
        *save_ptr = s + strlen(s);
        return s;
    }

    // Terminate the token and make *SAVE_PTR point past it.
    memset(end, 0, strlen(delim));
    *save_ptr = end + strlen(delim);
    return s;
}

伙计,这个答案只有在输入是这个时才有效,如果是“abUcd/USING=efgh”你的算法就不起作用。

这个答案对我来说是唯一有效的:

char *split(char *str, const char *delim)
{
    char *p = strstr(str, delim);

    if (p == NULL) return NULL;     // delimiter not found

    *p = '[=10=]';                      // terminate string after head
    return p + strlen(delim);       // return tail substring
}

int main(void)
{
    char str[] = "A/USING=B";
    char *tail;

    tail = split(str, "/USING=");

    if (tail) {
        printf("head: '%s'\n", str);
        printf("tail: '%s'\n", tail);
    }

    return 0;
}