Namespaces
Variants

wcstok, wcstok_s

From cppreference.net
< 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 时)必须同时传入前次调用存储的 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 函数 (页码: 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)

参阅

在字节字符串中查找下一个令牌
(函数)
C++ 文档 关于 wcstok