Namespaces
Variants

wcstok, wcstok_s

От ru.cppreference.net
 
 
 
 
Определён в заголовке <wchar.h>
wchar_t* wcstok( wchar_t* str, const wchar_t* delim, wchar_t** ptr );
(1) (начиная с C95)
(до C99)
wchar_t* wcstok( wchar_t*  restrict str, const wchar_t* restrict delim,
                 wchar_t** restrict ptr );
(начиная с C99)
wchar_t* wcstok_s( wchar_t* restrict str, rsize_t* restrict strmax,
                   const wchar_t* restrict delim, wchar_t** restrict ptr);
(2) (начиная с C11)
1) Находит следующий токен в широкой строке с нулевым завершителем, на которую указывает str. Символы-разделители определяются широкой строкой с нулевым завершителем, на которую указывает delim.
Эта функция предназначена для многократных вызовов для получения последовательных токенов из одной и той же строки.
  • Если str != NULL, вызов считается первым вызовом wcstok для данной конкретной широкой строки. Функция ищет первый широкий символ, который не содержится в delim.
  • Если такой широкий символ не найден, в str вообще нет токенов, и функция возвращает нулевой указатель.
  • Если такой широкий символ найден, он является началом токена. Затем функция ищет, начиная с этой точки, первый широкий символ, который содержится в delim.
  • Если такой широкий символ не найден, str содержит только один токен, и последующие вызовы wcstok будут возвращать нулевой указатель
  • Если такой широкий символ найден, он заменяется нулевым широким символом L'\0', а состояние анализатора (обычно указатель на следующий широкий символ) сохраняется в предоставленном пользователем месте *ptr.
  • Затем функция возвращает указатель на начало токена
  • Если str == NULL, вызов считается последующим вызовом wcstok: функция продолжает с того места, где остановилась в предыдущем вызове с тем же *ptr. Поведение такое же, как если бы указатель на широкий символ, следующий за последним обнаруженным токеном, был передан как str.
2) То же, что и (1), за исключением того, что на каждом шаге записывает количество оставшихся для просмотра символов из str в *strmax. Повторные вызовы (с нулевым str) должны передавать как strmax, так и ptr со значениями, сохранёнными предыдущим вызовом. Также следующие ошибки обнаруживаются во время выполнения и вызывают установленную в данный момент функцию обработчика ограничений, без сохранения чего-либо в объекте, на который указывает ptr
  • strmax, delim, или ptr является нулевым указателем
  • при не первом вызове (с нулевым str), *ptr является нулевым указателем
  • при первом вызове, *strmax равно нулю или больше, чем RSIZE_MAX / sizeof(wchar_t)
  • поиск конца токена достигает конца исходной строки (измеряемого начальным значением *strmax) без обнаружения нулевого завершителя
Как и все функции с проверкой границ, wcstok_s гарантированно доступна только если __STDC_LIB_EXT1__ определена реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 до включения <wchar.h>.

Параметры

str - указатель на широкую строку с нулевым завершителем для токенизации
delim - указатель на широкую строку с нулевым завершителем, определяющую разделители
ptr - указатель на объект типа wchar_t*, который используется как wcstok, так и wcstok_s для хранения внутреннего состояния анализатора
strmax - указатель на объект, который изначально содержит размер str: wcstok_s сохраняет количество символов, которые осталось проверить

Возвращаемое значение

Возвращает указатель на начало следующего токена или нулевой указатель, если больше нет токенов.

Примечание

Эта функция является деструктивной: она записывает L'\0' символы в элементы строки str. В частности, строковый литерал широких символов нельзя использовать в качестве первого аргумента wcstok.

В отличие от strtok, wcstok не обновляет статическое хранилище: она сохраняет состояние анализатора в предоставленном пользователем месте.

В отличие от большинства других токенизаторов, разделители в wcstok могут быть разными для каждого последующего токена и могут даже зависеть от содержимого предыдущих токенов.

Реализация wcstok_s в Windows CRT несовместима со стандартом C, это просто псевдоним для wcstok.

Пример

#include <stdio.h>
#include <wchar.h>

int main(void)
{
    wchar_t input[] = L"A bird came down the walk";
    printf("Parsing the input string '%ls'\n", input);
    wchar_t* buffer;
    wchar_t* token = wcstok(input, L" ", &buffer);
    while (token)
    {
        printf("%ls\n", token);
        token = wcstok(NULL, L" ", &buffer);
    }

    printf("Contents of the input string now: '");
    for (size_t n = 0; n < sizeof input / sizeof *input; ++n)
        input[n] ? printf("%lc", input[n]) : printf("\\0");
    puts("'");
}

Вывод:

Parsing the input string 'A bird came down the walk'
A
bird
came
down
the
walk
Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0'

Ссылки

  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.29.4.5.7 Функция wcstok (стр. 437-438)
  • K.3.9.2.3.1 Функция wcstok_s (стр. 645-646)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.24.4.5.7 Функция wcstok (стр. 383-384)

Смотри также

находит следующий токен в строке байтов
(функция)