Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Split string by a substring

I have following string:

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

I want to split to get separate A and B values with /USING= as a delimiter

How can I do it? I known strtok() but it just split by one character as delimiter.

like image 491
Ryo Avatar asked Feb 07 '23 23:02

Ryo


2 Answers

As others have pointed out, you can use strstr from <string.h> to find the delimiter in your string. Then either copy the substrings or modify the input string to split it.

Here's an implementation that returns the second part of a split string. If the string can't be split, it returns NULL and the original string is unchanged. If you need to split the string into more substrings, you can call the function on the tail repeatedly. The first part will be the input string, possibly shortened.

#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;
}
like image 169
M Oehm Avatar answered Feb 16 '23 02:02

M Oehm


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

Nopes, it's not.

As per the man page for strtok(), (emphasis mine)

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. [...]

So, it need not be "one character" as you've mentioned. You can using a string, like in your case "/USING=" as the delimiter to get the job done.

like image 30
Sourav Ghosh Avatar answered Feb 16 '23 04:02

Sourav Ghosh