wcstok_s
在头文件<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
。重复呼叫(使用null 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__
并且1
在包含之前用户定义为整数常量时才能保证可用wchar.h
。
参数
str | - | 指向以空字符结尾的宽字符串的标记 |
---|---|---|
delim | - | 指向以空字符结尾的宽字符串标识分隔符的指针 |
ptr | - | 指向wchar_t *类型的对象的指针,wcstok和wcstok_s用它来存储解析器的内部状态 |
strmax | - | 指向最初保存str大小的对象的指针:wcstok_s存储待检查的字符数 |
返回值
如果没有其他标记,则返回指向下一个标记或空指针开头的指针。
注意
这个函数具有破坏性:它将L'\0'
字符写入字符串的元素中str
。特别是,宽字符串不能用作第一个参数wcstok
。
与其不同strtok
,wcstok
不更新静态存储:它将分析器状态存储在用户提供的位置。
与大多数其他标记器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 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)
另请参阅
strtokstrtok_s(C11) | 在字节字符串(函数)中查找下一个标记 |
---|
| 用于wcstok |的C ++文档
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com