wcstok, wcstok_s
|
定义于头文件
<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 起) |
-
-
若
str
!
=
NULL
,此次调用被视为对该宽字符串的首次
wcstok调用。函数将搜索第一个 不 包含在 delim 中的宽字符。
-
- 若未找到此类宽字符,说明 str 中根本不存在令牌,函数将返回空指针。
- 若找到此类宽字符,该字符即为 令牌起始点 。随后函数从该位置开始搜索第一个 包含 在 delim 中的宽字符。
-
-
若未找到此类宽字符,说明
str
仅包含单个令牌,后续对
wcstok的调用将返回空指针。 - 若找到此类宽字符,该字符将被 替换 为空宽字符 L ' \0 ' ,且解析器状态(通常指向后续宽字符的指针)将存储于用户提供的 * ptr 位置。
-
若未找到此类宽字符,说明
str
仅包含单个令牌,后续对
- 随后函数返回指向令牌起始点的指针
-
若
str
==
NULL
,此次调用被视为
wcstok的后续调用:函数将从上一次调用中同一 * ptr 的中断处继续。其行为等同于将指向最后检测到的令牌后续宽字符的指针作为 str 传入。
-
若
str
!
=
NULL
,此次调用被视为对该宽字符串的首次
-
- 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 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
|
|