这在ISO C11 标准的Appendix K (bounds checking interfaces) 中有详细说明。标准的这个可选部分提供了标准核心部分中现有功能的“更安全”的(a)版本。
原型是:
char *strtok_s (
char * restrict s1,
rsize_t * restrict s1max,
const char * restrict s2,
char ** restrict ptr);
作为安全功能的一部分检查的运行时约束是:
- 指针
s1max、s2 和ptr 都必须为非空。
- 如果
s1 是空指针,那么*ptr 一定不是。
-
*s1max 的值必须小于或等于RSIZE_MAX。
- 第一次调用时,找到的令牌的结尾必须出现在
s1 的第一个 *s1max 字符内
- 找到的令牌的结尾必须出现在后续调用中继续搜索的第一个
*s1max 字符内。
安全方面是,如果违反任何这些约束,s1 或s2 上不会发生间接寻址,并且不会通过ptr 存储任何值。
除了那些额外的检查之外,它的工作原理与标准的strtok 函数几乎相同,从s1 返回标记,由s2 中的分隔符组分隔。我认为ptr 的使用使其成为线程安全的,因为它使用用户提供的非静态状态(b)。
(a) 引用是因为如果您知道如何正确使用标准的大部分部分已经安全:-)
(b)仍然缺少的一件事是具有空标记的能力,例如:
field1||||field5
因为strtok_s(和原版)将||||视为单个分隔符,我们必须找到其他方法来做到这一点</rant>:-)