Использование strtok () в цикле в C? - PullRequest
12 голосов
/ 02 октября 2009

Я пытаюсь использовать strtok () во вложенном цикле. Но это не дает мне желаемых результатов. Возможно, потому что они используют одну и ту же область памяти. Мой код имеет вид: -

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
 }

Ответы [ 3 ]

21 голосов
/ 02 октября 2009

Да, strtok(), действительно, использует некоторую статическую память для сохранения своего контекста между вызовами. Вместо этого используйте повторно входящую версию strtok(), strtok_r() или strtok_s(), если вы используете VS (идентично strtok_r()).

У него есть дополнительный контекстный аргумент, и вы можете использовать разные контексты в разных циклах.

char *tok, *saved;
for (tok = strtok_r(str, "%", &saved); tok; tok = strtok_r(NULL, "%", &saved))
{
    /* Do something with "tok" */
}
1 голос
/ 02 октября 2009

strtok использует статический буфер. В вашем случае вы должны использовать strtok_r. Эта функция использует буфер, предоставленный пользователем.

0 голосов
/ 20 мая 2010

WayneAKing опубликовал альтернативу в Центре разработчиков Microsoft.

Ссылаясь на него:

иди сюда

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

и скачайте этот файл

Stptok.C Улучшен токенизатор функция

Вы также можете скачать необходимые заголовочные файлы с того же сайта.

Это модифицированная версия strtok который размещает проанализированные токены (подстроки) в отдельном буфере. Вы должен иметь возможность изменить его удовлетворить ваши потребности.

  • Wayne

P.S. - Обратите внимание, что эти файлы могут быть в * nix формат по отношению к концу строки. т.е. только 0x0A, а не 0x0D 0x0A

Это альтернатива, если в вашей среде нет библиотек Microsoft.

Надеюсь, это поможет другим:)

...