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)
Смотри также
(C11) |
находит следующий токен в строке байтов (функция) |
Документация C++ для wcstok
| |