I have a strtok() clone for this purpose that returns a pointer range for each token, leaving the string untouched.

But then you have to copy out those pieces in order to have them null terminated so they can correctly function as strings.