当前位置: C语言 -- 标准库 -- <wchar.h> -- wcstok

wcstok函数


概要:
#include <wchar.h>
wchar_t *wcstok(wchar_t * restrict s1,
      const wchar_t * restrict s2,
      wchar_t ** restrict ptr);

描述:

该函数拆分参数s1指向的宽字符串。

连续调用该函数将参数s1指向的宽字符串拆分为一系列标记,每个标记使用参数s2指向字符串中的宽字符进行分隔。第三个参数指向调用者提供的wchar_t *类型指针,wcstok函数将继续扫描相同宽字符串的必要信息存入该指针。

第一次调用该函数,第一个参数为非空指针,函数将初始值存储在参数ptr指向的对象中;随后调用该函数,第一个参数为空指针,参数ptr指向的对象要求具有相同字符序列上一次调用存储的值,然后将其更新。参数s2指向的分隔宽字符串每次调用时可以不同。

第一次调用wcstok函数将搜索参数s1指向宽字符串中的第一个非分隔字符(不是参数s2指向宽字符串中的宽字符。)。如果不存在这样的宽字符,参数s1指向的宽字符串不存在标记,函数返回一个空指针;如果存在这样的宽字符,第一个标记将从该宽字符开始,函数从这里开始搜索当前的分隔字符。如果未搜索到当前分隔字符,当前标记将扩展至参数s1指向宽字符串的末尾,随后在相同宽字符串中搜索标记将返回空指针。如果搜索到当前分隔字符,该分隔字符将被一个空宽字符覆盖,当前标记结束,搜索下一个标记将从紧跟该字符的宽字符开始。

任何情况下,wcstok函数都会在ptr指向的指针中存储足够的信息,以便后续调用。随后每次调用wcstok函数将空指针用作第一个参数,未修改的ptr值用作第三个参数,从上次调用结束位置开始,重复上面的操作搜索下一个标记。


ISO/IEC 9899:2018标准定义了该函数的安全版本wcstok_s


参数:
wchar_t * restrict s1

指向被拆分宽字符串的指针。

const wchar_t * restrict s2

指向分隔字符串的指针。

wchar_t ** restrict ptr

指向wchar_t *类型对象的指针,函数在该对象中存储继续扫描相同宽字符串所需的必要信息。


返回值:

如果不存在标记,函数返回空指针;否则函数返回指向标记首字符的指针。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
/*函数wcstok范例*/

#include <locale.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_ALL, "");
    
    wchar_t wStr[] = L"邓稼先 钱学森 华罗庚 袁隆平 李四光 钱三强 \
                赵九章 茅以升 于敏 竺可桢 王淦昌 钱伟长 \
                吴文俊 苏步青 周培源 唐敖庆 终南山 屠呦呦";
    wchar_t delimiter[] = L" ";
    wchar_t *pwc;
    wchar_t *wPtr;
    int count = 0;

    /*统计人数。*/
    pwc = wcstok(wStr, delimiter, &wPtr);
    while(pwc != NULL)
    {
    	++count;
        pwc = wcstok(NULL, delimiter, &wPtr);
    }

    wprintf(L"共%d人。\n", count);
    
    return 0;
}


输出:

共18人。

注:使用ideone.com编译。


相关内容:
wmemchr 搜索指定宽字符在内存区域第一次出现位置的函数。
wcscspn 计算最大初始片段长度的函数。
wcspbrk 搜索宽字符在宽字符串中第一次出现位置的函数。
wcsrchr 搜索指定宽字符在宽字符串中最后一次出现位置的函数。
wcsspn 计算最大初始片段长度的函数。
wcsstr 搜索子字符串在宽字符串中第一次出现位置的函数。
wcschr 搜索指定宽字符在宽字符串中第一次出现位置的函数。