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::stringstd::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() 可以安全使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

JSONP 可以安全使用吗?

线程局部存储 TLS

可以在 Firebase 3 中实现自定义身份验证属性并将其与安全安全规则一起使用吗?

mysql_real_escape_string 真的可以安全使用吗? [复制]

会话存储可以安全吗?

std::atomic 可以安全地与 OpenMP 一起使用吗