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) |
str. Символы-разделители задаются широким строковым литералом с завершающим нулём, на который указывает delim.- Если
str != NULL, вызов считается первым вызовомwcstokдля данной широкой строки. Функция ищет первый широкий символ, который не содержится вdelim. - Если такой широкий символ не найден, в
strвообще нет токенов, и функция возвращает нулевой указатель. - Если такой широкий символ найден, он является началом токена. Затем функция ищет, начиная с этой позиции, первый широкий символ, который содержится в
delim. - Если такой широкий символ не найден,
strсодержит только один токен, и последующие вызовыwcstokбудут возвращать нулевой указатель - Если такой широкий символ найден, он заменяется нулевым широким символом
L'\0', а состояние синтаксического анализатора (обычно указатель на следующий широкий символ) сохраняется в предоставленной пользователем области*ptr. - Затем функция возвращает указатель на начало токена
- Если
str == NULL, вызов считается последующим вызовомwcstok: функция продолжает работу с места, на котором остановилась при предыдущем вызове с тем же*ptr. Поведение такое же, как если бы указатель на широкий символ, следующий за последним обнаруженным токеном, был передан в качествеstr.
*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)
См. также
|
(C11) | находит следующий токен в байтовой строке (функция) |
Документация по C++ для wcstok |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/wide/wcstok