wcstok, wcstok_s
来自cppreference.com
在标头 <wchar.h> 定义
|
||
(1) | ||
wchar_t* wcstok( wchar_t* str, const wchar_t* delim, wchar_t **ptr ); |
(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 只有一个记号,而对
- 然后函数返回指向记号起始的指针
- 若 str == NULL,则调用被当作对
wcstok
的后继调用:函数从带同一 *ptr 的先前调用所留下的位置开始持续。行为与如同将指向后随上次检测的记号的宽字符的指针作为 str 传递相同。
- 若 str != NULL,则此次调用被当做
2) 同 (1),但在每步时,写入 str 中留待查看的字符数到 *strmax。重复的调用(以空 str)必须传递先前的调用所存储的 strmax 和 ptr 值。并且在运行时检测下列错误,并调用当前安装的约束处理函数,且不向 ptr 指向的对象存储任何值:
- strmax、delim 或 ptr 为空指针
- 在非首次调用(以空 str)时,*ptr 为空指针
- 首次调用时,*strmax 为零或大于 RSIZE_MAX/sizeof(wchar_t)
- 对记号的搜索抵达源字符串结尾(以 *strmax 的初值测量),而未遇到空终止符
- 与所有带便捷检查函数一样,仅当实现定义了 __STDC_LIB_EXT1__,并且用户在包含 <wchar.h> 之前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 时,才保证
wcstok_s
可用。
参数
str | - | 指向要记号化的空终止宽字符串的指针 |
delim | - | 指向标识分隔符的空终止宽字符串的指针 |
ptr | - | 指向 wchar_t* 类型对象的指针,wcstok 和 wcstok_s 以之存储分析器的内部状态
|
strmax | - | 指向最初保有 str 大小的对象:wcstok_s 存储留待检验的字符数
|
返回值
返回指向下个记号起始的指针,或若无更多记号则为空指针。
注意
此函数是破坏性的:它会在字符串 str 的元素中写入 L'\0' 字符。特别是,宽字符串字面量不能用作 wcstok
的首参数。
不同于 strtok,wcstok
不更新静态存储:它在用户提供的位置中存储分析器状态。
不同于大多数其他记号化器,wcstok
中的分隔符对于各个后继记号均可不同,而且甚至能依赖于先前记号的内容。
Windows CRT 中的 wcstok_s 实现与 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 The wcstok function (第 437-438 页)
- K.3.9.2.3.1 The wcstok_s function (第 645-646 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.24.4.5.7 The wcstok function (第 383-384 页)
参阅
(C11) |
查找字节字符串中的下一个记号 (函数) |