Реализация `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);
}
Вышеуказанная программа производит ожидаемый результат.
Мне интересно, есть ли более легкие / более простые способы сделать это. Есть ли такие?