【问题标题】:Can't find documentation for strtok_s()找不到 strtok_s() 的文档
【发布时间】:2016-12-30 18:44:18
【问题描述】:

传递给它的每个参数到底是什么,它返回什么?

它究竟比普通的strtok 好多少?

请给我尽可能简单和基本的解释。

【问题讨论】:

标签: c strtok


【解决方案1】:

这在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);

作为安全功能的一部分检查的运行时约束是:

  • 指针s1maxs2ptr 都必须为非空。
  • 如果s1 是空指针,那么*ptr 一定不是。
  • *s1max 的值必须小于或等于RSIZE_MAX
  • 第一次调用时,找到的令牌的结尾必须出现在 s1 的第一个 *s1max 字符内
  • 找到的令牌的结尾必须出现在后续调用中继续搜索的第一个 *s1max 字符内。

安全方面是,如果违反任何这些约束,s1s2 上不会发生间接寻址,并且不会通过ptr 存储任何值。

除了那些额外的检查之外,它的工作原理与标准的strtok 函数几乎相同,从s1 返回标记,由s2 中的分隔符组分隔。我认为ptr 的使用使其成为线程安全的,因为它使用用户提供的非静态状态(b)


(a) 引用是因为如果您知道如何正确使用标准的大部分部分已经安全:-)


(b)仍然缺少的一件事是具有空标记的能力,例如:

field1||||field5

因为strtok_s(和原版)将||||视为单个分隔符,我们必须找到其他方法来做到这一点</rant>:-)

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多