Использование strtok() в цикле в C?

Я пытаюсь использовать 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
 }

Ответ 1

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

Ответ 2

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

Ответ 3

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

Цитирую его:

Иди сюда

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

и загрузите этот файл

stptok.c Улучшен токенинг функция

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

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

  • Wayne

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

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