Implementando `strtok` cuyo delimitador tiene más de un carácter

Fragmento de código:

char str[] = "String1::String2:String3:String4::String5";
char *deli = "::";
char *token = strtok(str,deli);

while(token != NULL)
{
  printf("Token= \"%s\"\n", token);
  token=strtok(NULL,deli);
}

El fragmento de código anterior produce la salida:

Token="String1"
Token="String2"
Token="String3"
Token="String4"
Token="String5"

pero quiero que la salida sea:

Token="String1"
Token="String2:String3:String4"
Token="String5"

Sé que no estoy obteniendo el resultado esperado porquecada personaje en el segundo argumento destrtok se considera como un delimitador.

Para obtener el resultado esperado, he escrito un programa que usastrstr(y otras cosas) para dividir la cadena dada en tokens de modo que obtenga el resultado esperado. Aquí está el programa:

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

int myStrtok(char* str,char* deli)
{
    if(str==NULL || deli==NULL)
        return -1;

    int tokens=0;
    char *token;
    char *output=str;


    while((token=strstr(output,deli))!=NULL)
    {

        bool print=true;

        if(output != token)
        {
            printf("Token = \"");
            tokens++;
            print=false;
        }

        while(output != token)
        {
            putchar(*output);
            output++;
        }

        if(print==false)
            printf("\"\n");
        output+=strlen(deli);
    }

    if(strlen(output)>0)
    {
        printf("Token = \"%s\"",output);
        tokens++;
    }
    printf("\n\n");
    return tokens;
}

int main(void)
{
    char str[]="One:1:Two::Three::::";
    char *deli="::";

    int retval;
    printf("Original string=\"%s\"\n\n",str);

    if((retval=myStrtok(str,deli))==-1)
        printf("The string or the delimeter is NULL\n");
    else
        printf("Number of tokens=%d\n", retval);
    return(EXIT_SUCCESS);
}

El programa anterior produce el resultado esperado.

Me pregunto si hay formas más fáciles / simples de hacerlo. ¿Hay alguna?

Respuestas a la pregunta(3)

Su respuesta a la pregunta