Beware of C API
The C API can be very efficient, but will need exposed raw data (i.e. pointers, etc.), which won't help the safety of the code. Use existing C++ API instead, or encapsulate the C API with C++ code.
e.g.:
// char * d, * s ;
strcpy(d, s) ; // BAD
// std::string d, s ;
d = s ; // GOOD
Never use strtok
strtok is not reentrant. Which means that if one strtok is started while another is not ended, one will corrupt the "internal data" of the other.
How it clearly facilitates safer code, which minimizes the risk of enigmatic bugs, which increases maintainability, etc.?
Using C API means using raw types, which can lead to interesting bugs like buffer overflow (and potential stack corruption) when a sprintf goes too far (or string cropping when using snprintf, which is a kind of data corruption). Even when working on raw data, malloc can be easily abused, as shown by the following code:
int * i = (int *) malloc(25) ; // Now, I BELIEVE I have an array of 25 ints!
int * j = new int[25] ; // Now, I KNOW I have an array of 25 ints!
Etc. etc..
As for strtok: C and C++ are stack-enabled languages, that enable to user to not care about what functions are above his own on the stack, and what functions will be called below his own on the stack. strtok removes this freedom of "not caring"