Форум программистов, компьютерный форум CyberForum.ru

strtok_s - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 61, средняя оценка - 4.79
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
02.02.2013, 21:42     strtok_s #1
В отличие от strtok в нем есть еще одна переменная context. Для чего она?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5383 / 1766 / 323
Регистрация: 10.12.2010
Сообщений: 5,223
Записей в блоге: 3
02.02.2013, 21:47     strtok_s #2
Почитайте тут: http://msdn.microsoft.com/ru-ru/library/ftsafwz3.aspx
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
02.02.2013, 21:57  [ТС]     strtok_s #3
HighPredator, поверьте, я умею пользоваться поиском. Но внятного объяснения не нашел и потыкав палочкой, тоже не все понял.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12079 / 6940 / 782
Регистрация: 27.09.2012
Сообщений: 17,215
Записей в блоге: 2
Завершенные тесты: 1
03.02.2013, 01:56     strtok_s #4
Цитата Сообщение от Kgfq Посмотреть сообщение
Но внятного объяснения не нашел и потыкав палочкой, тоже не все понял.
А по-моему там всё четко написано:
strToken
String containing token or tokens.
strDelimit
Set of delimiter characters.
context
Used to store position information between calls to strtok_s

locale
Locale to use.
И потом идет пример. Выделю из него несколько строк:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    token1 = strtok_s( string1, seps, &next_token1);//Вот эти две строчки особенно интересны.
    token2 = strtok_s ( string2, seps, &next_token2);//Разница видна?
    // While there are tokens in "string1" or "string2"
    while ((token1 != NULL) || (token2 != NULL))
    {
        // Get next token:
        if (token1 != NULL)
        {
            printf( " %s\n", token1 );
            token1 = strtok_s( NULL, seps, &next_token1);
        }
        if (token2 != NULL)
        {
            printf("        %s\n", token2 );
            token2 = strtok_s (NULL, seps, &next_token2);
        }
    }
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
03.02.2013, 13:59  [ТС]     strtok_s #5
Croessmah, не совсем все понятно. =\

C++
1
2
strtok_s(str, ".", &context); // здесь контекст только заполняется, но из него ничего не берется
strtok_s(NULL, ".", &context); // а здесь и берется и заполняется.
Так?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1237 / 986 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.02.2013, 15:23     strtok_s #6
Короче, в чём геморрой. Обычная strtok() не может в обработку нескольких строк одновременно. По историческим причинам (см. время создания Си) у неё там внутри статическая переменная с локальной областью видимости используется для хранения промежуточной позиции в строке (именно поэтому передаётся NULL в качестве индикатора, что продолжать надо с прошлого места). Если мы разбили одну строку частично на токены с помощью strtok(), потом берёмся за другую строку, а потом хотим вернуться к предыдущей, то получаем фигу с маслом, потому что другая строка уже заменила ту статическую внутреннюю переменную на себя. Вот эта версия делает эту переменную всё же локальной, а не глобальной статической, что позволяет одновременно иметь несколько недоразобранных strtok_s() строк.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
03.02.2013, 15:40  [ТС]     strtok_s #7
~OhMyGodSoLong~, это я и так понимаю. Просто ответь так или не так на мой предыдущий пост
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2013, 16:23     strtok_s
Еще ссылки по теме:

Объявление третьей переменной в функции strtok_s C++
C++ strtok_s ломается в конце строки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1237 / 986 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.02.2013, 16:23     strtok_s #8
Так.
Yandex
Объявления
03.02.2013, 16:23     strtok_s
Ответ Создать тему
Опции темы

Текущее время: 01:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru