Реализация `strtok`, разделитель которого имеет более одного символа

Фрагмент кода:

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);
}

Приведенный выше фрагмент кода производит вывод:

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

но я хочу вывод:

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

Я знаю, что я не получаю ожидаемый результат, потому чтокаждый персонаж во втором аргументеstrtok считается разделителем.

Чтобы получить ожидаемый результат, я написал программу, которая используетstrstr(и другие вещи), чтобы разбить данную строку на токены так, чтобы я получил ожидаемый результат. Вот программа:

#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);
}

Вышеуказанная программа производит ожидаемый результат.

Мне интересно, есть ли более легкие / более простые способы сделать это. Есть ли такие?

Ответы на вопрос(1)

Ваш ответ на вопрос