Xi Xu's More Things

wcstok, wcstok_s

来自cppreference.com
< c‎ | string‎ | wide
 
 
 
空终止宽字符串
函数
字符操作
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C99)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
转换成数值格式
(C95)(C99)
(C95)(C99)
(C99)(C95)(C99)
(C99)(C99)
字符串操作
(C95)(C11)
(C95)(C11)
(C95)(C11)
(C95)(C11)
(C95)(C11)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
wcstokwcstok_s
(C95)(C11)
数组操作
(C95)(C11)
(C95)(C11)
(C95)
(C95)
(C95)
 
在标头 <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 。并且在运行时检测下列错误,并调用当前安装的约束处理函数:
  • strmaxdelimptr 为空指针
  • 在非首次调用(以空 str )时, *ptr 为空指针
  • 首次调用时, *strmax 为零或大于 RSIZE_MAX/sizeof(wchar_t)
  • 对记号的搜索抵达源字符串结尾(以 *strmax 的初值测量),而未遇到空终止符
同所有边界检查函数, wcstok_s 仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含 wchar.h 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。

参数

str - 指向要记号化的空终止宽字符串的指针
delim - 指向标识分隔符的空终止宽字符串的指针
ptr - 指向 wchar_t* 类型对象的指针, wcstokwcstok_s 以之存储分析器的内部状态
strmax - 指向最初保有 str 大小的对象: wcstok_s 存储留待检验的字符数

返回值

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

注意

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

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

不同于大多数其他记号化器, wcstok 中的分隔符能对于后继记号不同,而且甚至能依赖于先前记号的内容。

示例

#include <wchar.h>
#include <stdio.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 页)

参阅

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