strtok() 可以安全使用吗?
Posted
技术标签:
【中文标题】strtok() 可以安全使用吗?【英文标题】:Is strtok() safe to use [duplicate] 【发布时间】:2015-06-01 09:50:45 【问题描述】:我正在阅读很多关于 strtok()
的负面信息,有人说它已经过时,有人说它不是线程安全的,等等。
那么真相是什么,我可以用strtok()
吗?它是线程安全的吗?
注意:我使用的是 Visual C++。
【问题讨论】:
请参考***.com/questions/4031075/… 一些相关问题及答案显示在右侧(查找“相关”),例如this 一般而言,在编写 C++ 代码时应避免使用 C 标准库 - 改用正确的 C++ 数据类型和习语。 您进行了哪些研究?strok
不是线程安全的,它使用静态缓冲区。
【参考方案1】:
你可以使用它,它是标准库的一部分。
它使用函数的所有用户共享的内部存储,所以不它不是线程安全的。
它还会修改你交给它的字符串,这很吓人。
在大多数情况下,我不建议使用它。
【讨论】:
【参考方案2】:strtok()
是“安全的”,因为它可以使用并且没有任何错误。但是,如果您正在编程 C++ 而不是 C,则应该使用 C++ 字符串工具来处理字符串,而不是依赖于遗留的 C 函数。像 std::string
和 std::stringstream
这样的东西会给你比strtok
更大的灵活性,同时减少逻辑错误的可能性。
【讨论】:
【参考方案3】:正如 unwind 所说,您可以使用它,strtok
在 Visual C++ 中是安全的,但在其他地方不安全。 strtok
存在的一个问题是 strtok()
函数在解析时使用静态缓冲区,因此它不是线程安全的。 strtok_s
是它的替代品。来自here:
6.7.3.1 strtok_s 函数 strtok_s 函数修复了两个问题 在 strtok 函数中:
新参数 s1max 可防止 strtok_s 存储在 字符串被标记化。 (字符串 被分成令牌既是一个 函数的输入和输出 strtok_s 将空字符存储到 字符串。) 新参数 ptr 消除了静态内部状态 防止 strtok 重入 (第 1.1.12 条)。 (ISO/IEC 9899 函数 wcstok 和 ISO/IEC 9945 (POSIX) 函数 strtok_r 修复此问题 同样的问题。)
【讨论】:
以上是关于strtok() 可以安全使用吗?的主要内容,如果未能解决你的问题,请参考以下文章
可以在 Firebase 3 中实现自定义身份验证属性并将其与安全安全规则一起使用吗?