«Лучше», чем strtok & Co, см. Ниже:
int strsplit(const char *s,char ***l,char t)
{
int r=0;
while( strchr(s,t) )
{
*l=realloc(*l,++r*sizeof*l);
memcpy((*l)[r-1]=calloc(1,strchr(s,t)-s+1),s,strchr(s,t)-s);
s=strchr(s,t)+1;
}
*l=realloc(*l,++r*sizeof*l);
memcpy((*l)[r-1]=calloc(1,strlen(s)+1),s,strlen(s));
return r;
}
int main()
{
char **l=0,*x="1;2;;4";
int i,r=strsplit(x,&l,';');
for(i=0;i<r;++i)
{
puts(l[i]);
free(l[i]);
}
free(l);
return 0;
}
лучше, потому что строка может быть const, она работает в многопоточности, пустые работы не игнорируются.