通过子字符串拆分字符串

时间:2016-01-22 08:53:14

标签: c string tokenize strtok

我有以下字符串:

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

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

我该怎么办?我知道strtok()但它只是将一个字符拆分为分隔符。

5 个答案:

答案 0 :(得分:3)

  

我知道strtok()但它只是将一个字符拆分为分隔符

不,不是。

根据strtok)()的{​​{3}},(强调我的

  

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

     

[...] delim参数指定字节集,用于分隔已解析字符串中的标记。 [...] 解析后的字符串中的两个或多个连续分隔符字节的序列被视为单个分隔符。 [...]

所以,你不必像你提到的那样“一个字符”。您可以使用字符串(例如您的"/USING="作为分隔符来完成工作。

答案 1 :(得分:2)

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

这是一个返回拆分字符串的第二部分的实现。如果字符串无法拆分,则返回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 = '\0';                      // 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;
}

答案 2 :(得分:1)

这里有一个小功能可以做到这一点。它与strtok_r的工作原理完全相同,只是将定界符作为定界字符串而不是定界字符列表。

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

    if (s == NULL || *s == '\0')
    {
        *save_ptr = s;
        return NULL;
    }

    // Skip leading delimiters.
    while (strstr(s,delim)==s) s+=strlen(delim);
    if (*s == '\0')
    {
        *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;
}

答案 3 :(得分:0)

this。当我在谷歌搜索你的问题时,我得到了这个。

在你的情况下,它将是:

#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在线编译并运行它。

答案 4 :(得分:0)

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

这个答案对我唯一有效:

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

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

    *p = '\0';                      // 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;
}