Arduino has very limited resources and C strings are much better in this environment. If you do not need to preserve the original one I usually amend that string.
char **split(char **argv, int *argc, char *string, const char delimiter, int allowempty)
{
    *argc = 0;
    do
    {
        if(*string && (*string != delimiter || allowempty))
        {
            argv[(*argc)++] = string;
        }
        while(*string && *string != delimiter) string++;
        if(*string) *string++ = 0;
        if(!allowempty) 
            while(*string && *string == delimiter) string++;
    }while(*string);
    return argv;
}
int main()
{
    char str[] = "first||Second|||third";
    char str1[] = "first||Second|||third";
    char *argv[8];
    int argc;
    split(argv, &argc, str, '|', 0);
    for(int i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);
    printf("-----------------\n");
    split(argv, &argc, str1, '|', 1);
    for(int i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);
}