In this article, I share with you a simple C++ class that wraps the string tokenization function strtok(). The QuickTokenizer class makes it easy to tokenize and enumerate the tokens in a thread-safe manner.
The class code
////////////////////////////////////////////////////////////////////////// class QuickTokenizer { private: char *buf; char *token; char *ctx; void FreeBuffers() { if (this->token != NULL) { free(this->token); this->token = NULL; } if (this->buf != NULL) { free(this->buf); this->buf = NULL; } } public: QuickTokenizer() : buf(NULL), token(NULL) { } const char *Tokenize( const char *str, const char *tok) { this->buf = _strdup(str); this->token = _strdup(tok); return strtok_s(buf, token, &ctx); } const char *NextToken() { return strtok_s(NULL, token, &ctx); } ~QuickTokenizer() { FreeBuffers(); } };
Do you want to master Batch Files programming? Look no further, the Batchography is the right book for you.
Available in print or e-book editions from Amazon.
Explanation and usage example
- Unlike strtok(), this class takes a copy of the string to be tokenized and thus the source string is a “const char*” instead of “char *”
- The class uses the safe version of strtok() which is strtok_s(). This allows you to do thread-safe tokenization
- Using the C++ destructor, you don’t have to worry about memory allocation / deallocation
Example
The following example, tokenizes a semi-colon separated string and iterates over each token:
void test() { char *in_str = "a;b;c;d;e;f;g;h"; QuickTokenizer qt; for (const char *t = qt.Tokenize(in_str, ";"); t != NULL; t = qt.NextToken()) { printf("token is: %s\n", t); } }
You might also like: