wcstok, wcstok_s

来自cppreference.com
< 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 存储留待检验的字符数

返回值

返回指向下个记号起始的指针,或若无更多记号则为空指针。

注意

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

不同于 strtokwcstok 不更新静态存储:它在用户提供的位置中存储分析器状态。

不同于大多数其他记号化器,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 The wcstok function (第 437-438 页)
  • K.3.9.2.3.1 The wcstok_s function (第 645-646 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.24.4.5.7 The wcstok function (第 383-384 页)

参阅

查找字节字符串中的下一个记号
(函数)