Spec-Zone.ru › C

wcstok, wcstok_s

Определено в заголовочном файле <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), за исключением того, что на каждом шаге функция записывает в *strmax количество символов, которые осталось просмотреть в str. При повторных вызовах (с нулевым 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)

См. также

strtokstrtok_s
(C11)
находит следующий токен в байтовой строке
(функция)
Документация по C++ для wcstok

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/wide/wcstok

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API