Reputation: 4051
I am trying to use strtok()
in nested loops but this is not giving me desired results,
possibly because they are using the same memory location. My code is of the form:-
char *token1 = strtok(Str1, "%");
while (token1 != NULL)
{
char *token2 = strtok(Str2, "%");
while (token2 != NULL)
{
//Do something
token2 = strtok(NULL, "%");
}
// Do something more
token1 = strtok(NULL, "%");
}
Upvotes: 14
Views: 13581
Reputation: 9954
WayneAKing posted an alternative in the Microsoft Developer Center.
Citing him:
Go here
and download this file
stptok.c
Improved tokenizing functionYou can also download the needed header files from the same site.
This is a modified version of strtok which places the parsed tokens (substrings) in a separate buffer. You should be able to modify it to accommodate your needs.
- Wayne
P.S. - Note that these files may be in *nix format with respect to end-of-lines. i.e. - 0x0A only and not 0x0D 0x0A
This is an alternative if you don't have the Microsoft libraries in your environment.
Upvotes: 1
Reputation: 84892
Yes, strtok()
, indeed, uses some static memory to save its context between invocations. Use a reentrant version of strtok()
, strtok_r()
instead, or strtok_s()
if you are using VS (identical to strtok_r()
).
It has an additional context argument, and you can use different contexts in different loops.
char *tok, *saved;
for (tok = strtok_r(str, "%", &saved); tok; tok = strtok_r(NULL, "%", &saved))
{
/* Do something with "tok" */
}
Upvotes: 23
Reputation: 14436
strtok is using a static buffer. In your case you should use strtok_r. This function is using a buffer provided by the user.
Upvotes: 2