命名空间
变体
操作

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 的第一个参数。

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)

[编辑] 另请参阅

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