Namespaces
Variants

wcstok, wcstok_s

来自 zh.cppreference.net
定义于头文件 <wchar.h>
wchar_t* wcstok( wchar_t* str, const wchar_t* delim, wchar_t** ptr );
(1) (自 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 的初始值衡量)而未遇到空终止符
与所有边界检查函数一样,wcstok_s 仅当实现定义了 __STDC_LIB_EXT1__ 且用户在包含 __STDC_WANT_LIB_EXT1__wchar.h1 之前将 < 定义为整数常量 > 时才保证可用。

参数

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