Splitting and printing comma-separated values
sizeof(char) by definition is 1. tmp += l + 1; would be as good.
I don't see a need to special case l == 0.
You don't have to initialize l in a loop header: it is immediately reassigned.
gcc complains about precision specifier in printf("\"%.*s\"\n", l, tmp) being size_t; unfortunately, cast is unavoidable.
I don't see a need for 2 separate loops. A single

char * tmp = (char *)str;
do {
    int l = strcspn (tmp, tok);
    printf("\"%.*s\"\n", l, tmp);
    tmp += l + 1;
} while (tmp[-1]);
return 0;


works equally well.