命名空间
变体
操作

wcstok, wcstok_s

来自 cppreference.cn
< c‎ | string‎ | wide
在头文件 <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 == NULL,则此调用被视为对 wcstok 的后续调用:函数从上次调用中断的地方继续,使用相同的 *ptr。其行为与将指向最后一个检测到的标记后面的宽字符的指针作为 str 传递相同。
2)(1) 相同,除了每一步都将 str 中剩余的字符数写入 *strmax。重复调用(使用空 str)必须将 strmaxptr 都与上次调用存储的值一起传递。此外,以下错误在运行时被检测到并调用当前安装的 约束处理程序 函数,而不将任何内容存储到 ptr 指向的对象中。
  • strmaxdelimptr 是空指针。
  • 在非初始调用(使用空 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* 类型的对象的指针,wcstokwcstok_s 都使用它来存储解析器的内部状态。
strmax - 指向一个对象的指针,该对象最初保存 str 的大小:wcstok_s 存储剩余要检查的字符数。

[编辑] 返回值

返回指向下一个标记开头的指针,如果没有更多标记则返回空指针。

[编辑] 注意

此函数是破坏性的:它将 L'\0' 字符写入字符串 str 的元素中。特别是,宽字符串字面量不能用作 wcstok 的第一个参数。

strtok 不同,wcstok 不更新静态存储:它将解析器状态存储在用户提供的位置。

与大多数其他标记器不同,wcstok 中的分隔符可以为每个后续标记而不同,甚至可以取决于前一个标记的内容。

Windows CRTwcstok_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)

[编辑] 另请参阅

查找字节字符串中的下一个标记
(函数) [编辑]
C++ 文档 for wcstok