Использование 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 который размещает проанализированные токены (подстроки) в отдельном буфере. Вы должен иметь возможность изменить его приспособить ваши потребности.
Постскриптум - Обратите внимание, что эти файлы могут быть в * nix формат по отношению к концу строки. т.е. только 0x0A, а не 0x0D 0x0A
Это альтернатива, если в вашей среде нет библиотек Microsoft.