strtok() 可以安全使用吗?

     2023-02-17     304

关键词:

【中文标题】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(线程不安全),线程安全函数strtok_r

strtok_r函数---字符串分割函数函数原型:    char*strtok_r(char*str,constchar*delim,char**saveptr);参数:str:被分割的字符串,若str为NULL,则被分割的字符串为*saveptrdelim:依据此字符串分割strsaveptr:分割后剩余部分的字符串... 查看详情

JSONP 可以安全使用吗?

】JSONP可以安全使用吗?【英文标题】:IsJSONPsafetouse?【发布时间】:2010-10-1111:13:34【问题描述】:在使用JSONP时有哪些安全问题需要考虑?【问题讨论】:该网站确实是一个安全的网站..我只想知道我的服务器存储的cookie是否存... 查看详情

使用strtok从字符串中解析空标记(代码片段)

...解析为单个值。2342|2sd45|dswer|2342||5523|||3654|Pswt我正在使用strtok循环执行此操作。对于第五个标记,我得到5523.但是,我需要考虑两个分隔符||之间的空值。根据我的要求,5523应该是第六个令牌。token=(char*)strtok(strAccInfo,"|");for(iLoop=... 查看详情

会话存储可以安全吗?

】会话存储可以安全吗?【英文标题】:Cansessionstoragebesafe?【发布时间】:2011-08-0907:55:09【问题描述】:我想使用会话存储在数据库中只查询一次用户数据,然后简单地使用JS来检索它,所以我正在考虑使用会话存储。我的问题... 查看详情

用户代码可以安全地使用结构填充吗?

】用户代码可以安全地使用结构填充吗?【英文标题】:Canthestructpaddingbesafelyusedbytheusercode?【发布时间】:2011-01-0201:37:23【问题描述】:假设我有如下结构:structStructcharChar;intInt;;并且sizeof(int)大于一并且编译器为Char成员变量添... 查看详情

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

】std::atomic可以安全地与OpenMP一起使用吗【英文标题】:Canstd::atomicbesafelyusedwithOpenMP【发布时间】:2014-02-2812:25:13【问题描述】:我目前正在尝试学习如何使用OpenMP,但我有一个问题。这样做是否安全:std::atomic<double>result;#p... 查看详情

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

】mysql_real_escape_string真的可以安全使用吗?[复制]【英文标题】:Ismysql_real_escape_stringisreallysafetouse?[duplicate]【发布时间】:2011-09-1600:33:11【问题描述】:好的,在我开始在我的学校项目中编写MySQL之前,我有一个问题。mysql_real_es... 查看详情

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

】mysql_real_escape_string真的可以安全使用吗?[复制]【英文标题】:Ismysql_real_escape_stringisreallysafetouse?[duplicate]【发布时间】:2011-09-1600:33:11【问题描述】:好的,在我开始在我的学校项目中编写MySQL之前,我有一个问题。mysql_real_es... 查看详情

我可以使用 boost::threadpool 作为“线程安全队列”吗?

】我可以使用boost::threadpool作为“线程安全队列”吗?【英文标题】:Caniuseboost::threadpoolasa\'thread-safequeue\'?【发布时间】:2011-01-0123:35:09【问题描述】:我需要的实际上是一个线程安全的队列结构,其中多个客户端不断将数据转... 查看详情

Reactjs:我可以使用状态安全地访问兄弟组件吗?

】Reactjs:我可以使用状态安全地访问兄弟组件吗?【英文标题】:Reactjs:canIsafelyaccessasiblingcomponentusingstate?【发布时间】:2019-05-1705:42:44【问题描述】:我从一两个星期开始就使用ReactJS,现在我正在尝试使用它构建一个应用程序... 查看详情

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

】可以在Firebase3中实现自定义身份验证属性并将其与安全安全规则一起使用吗?【英文标题】:CancustomauthpropertiesbeimplementedandusedwithsecuritysecurityrulesinFirebase3?【发布时间】:2016-09-1916:15:30【问题描述】:legacyFirebasedocumentation表示... 查看详情

您可以在没有线程安全的情况下使用 ConfigureAwait(false) 吗?

】您可以在没有线程安全的情况下使用ConfigureAwait(false)吗?【英文标题】:CanyouuseConfigureAwait(false)withoutbeingthread-safe?【发布时间】:2021-07-0211:55:12【问题描述】:我看到各地的人都建议尽可能使用ConfigureAwait(false),这是图书馆作... 查看详情

我可以只使用 aws 安全组而不是完整的 *** 连接吗?

】我可以只使用aws安全组而不是完整的***连接吗?【英文标题】:CanIgetawaywithjustusingawssecuritygroupsinsteadofafull***connection【发布时间】:2019-03-0709:10:21【问题描述】:我的问题很基本。我知道我可以在aws中设置服务器并设置一个安... 查看详情

我可以使用安全 WebSocket (wss) 连接到本地 Windows 服务应用程序吗

】我可以使用安全WebSocket(wss)连接到本地Windows服务应用程序吗【英文标题】:CanIconnecttolocalwindowsserviceapplicationwithsecureWebSocket(wss)【发布时间】:2021-01-2002:41:34【问题描述】:我可以使用安全WebSocket(wss)连接到本地Windows服务应用... 查看详情

现在可以安全使用 T-SQL 中的 UDF 吗?

】现在可以安全使用T-SQL中的UDF吗?【英文标题】:AreUDFsinT-SQLsafetousenow?【发布时间】:2019-10-1522:31:58【问题描述】:14年来,我一直信奉“永远不要在超过一两行受到影响的行上使用UDF”。我正准备通过一个非常基本的示例与... 查看详情

NSNotificationCenter 线程安全吗?

...rthreadsafe?【发布时间】:2013-04-1210:01:03【问题描述】:我可以在给定队列中发布通知并在另一个队列中接收吗?我想使用通知来传达不同的队列,但我不确定这是否安全...【问题讨论】:你可以使用它,但是有一些先进的解决方... 查看详情

我可以安全地设置 TERM 环境变量吗?

】我可以安全地设置TERM环境变量吗?【英文标题】:MayIsetTERMenvironmentvariablesafely?【发布时间】:2017-01-2313:15:10【问题描述】:我正在编写一个使用termcaps的程序,我需要知道我使用的是哪种终端。我知道我可以通过getenv("TERM... 查看详情

我们可以在方法中使用 AtomicInteger 作为局部变量并实现线程安全吗?

】我们可以在方法中使用AtomicInteger作为局部变量并实现线程安全吗?【英文标题】:CanweuseAtomicIntegerasalocalvariableinamethodandachievethreadsafety?【发布时间】:2016-06-3012:35:53【问题描述】:publicvoidtSafe(List<Foo>list,Propertiesstatus)if(lis... 查看详情