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 wcstok 函数 (p: 437-438)
- K.3.9.2.3.1 wcstok_s 函数 (p: 645-646)
- C99 标准 (ISO/IEC 9899:1999)
- 7.24.4.5.7 wcstok 函数 (p: 383-384)
[编辑] 另请参阅
(C11) |
在字节字符串中查找下一个标记。 (函数) |
C++ 文档 为 wcstok
|