传递给它的每个参数到底是什么,它返回什么?
它到底有多好于普通的strtok
?
请给我最简单最基本的解释。
最佳答案
这在Appendix K (bounds checking interfaces)
标准的ISO C11
中有详细说明。该标准的可选部分提供了在标准的核心部分中提供的已经存在的功能的“更安全”(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
。找到的令牌的结尾必须出现在第一个调用的
*s1max
的第一个s1
字符内找到的标记的结尾必须出现在随后调用时继续搜索的位置的前
*s1max
个字符内。安全方面是,如果违反了这些约束中的任何一个,则在
s1
或s2
上不会发生间接寻址,也不会通过ptr
存储任何值。除了这些额外的检查,它的工作方式与标准的
strtok
函数基本相同,返回s1
中由s2
中的分隔符组分隔的标记。我认为使用ptr
使其线程安全,因为它使用用户提供的非静态状态(b)。(a)引用,因为如果你知道如何正确使用标准的大部分内容,那么它们已经是安全的了:-)
(b)仍然缺少的一件事是拥有空令牌的能力,例如:
field1||||field5
因为
strtok_s
(和原始的)将||||
视为一个单独的分隔符,所以我们必须找到其他方法来实现这一点关于c - 找不到strtok_s()的文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23064672/