Using strtok() in a loop in C?

我们两清 提交于 2019-11-26 02:58:59

问题


I am trying to use strtok() in nested loop. But this is not giving me desired results. Possibly because they are using same memory location. My code is of the form:-

char *token1 = strtok(Str1, \"%\");
while(token1 != NULL )
{
  char *token2 = strtok(Str2, \"%\");
  while(token2 != NULL )
   {
      //DO SMTHING
      token2 = strtok(NULL, \"%\");
    }
     token1 = strtok(NULL, \"%\");
     // Do something more
 }

回答1:


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" */
}



回答2:


strtok is using a static buffer. In your case you should use strtok_r. This function is using a buffer provided by the user.




回答3:


WayneAKing posted an alternative in the Microsoft Developer Center.

Citing him:

Go here

http://cpp.snippets.org/code/

and download this file

stptok.c Improved tokenizing function

You 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.



来源:https://stackoverflow.com/questions/1509654/using-strtok-in-a-loop-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!