C 语言 Strtok_r

2025年1月7日 | 阅读 4 分钟

在本文中,我们将讨论 C 语言中的 strtok_r() 函数,包括其语法和示例。

C 语言中的 strtok()strtok_r() 函数允许我们使用分隔符来分割字符串。拆分字符串的任务非常频繁。例如,我们可能希望从文件中逗号分隔的对象列表中获取数组中的单个对象。

strtok() 函数是什么?

strtok() 方法使用指定的分隔符来分割 **Str[]**,并返回下一个标记。必须重复调用它以获取所有标记。当没有更多标记时,它返回 **NULL**。

strtok() 的语法

它具有以下语法:

参数

str: 指向要标记化的字符串的指针。

delims: 一个包含所有分隔符的字符串。

返回值

它返回在字符串中遇到的第一个标记的指针。

如果没有找到更多标记,则返回 NULL。

程序

让我们用一个例子来说明如何使用 C 语言中的 strtok() 函数来分割字符串。

输出

Strtok_r in C

strtok_r() 函数是什么?

Strtok_r() 函数与 C 语言中的 strtok() 函数一样,执行解析字符串为标记序列的相同任务。作为 strtok() 的可重入变体,strtok_r() 是线程安全的。

strtok_r() 的语法

它具有以下语法:

参数

str: 指向要标记化的字符串的指针。

delims: 一个包含所有分隔符的字符串。

saveptr: 指向一个 char * 变量的指针,该变量由 strtok_r() 内部使用,以在解析相同字符串的连续调用之间维护上下文。

返回值

它返回在字符串中遇到的第一个标记的指针。

如果没有找到更多标记,则返回 NULL。

程序

让我们用一个例子来说明如何使用 C 语言中的 strtok_r() 函数来分割字符串。

输出

Strtok_r in C

strtok() 和 strtok_r() 之间的区别

C 语言中的 strtok() 和 strtok_r() 之间有几个区别。C 语言中 strtok() 和 strtok_r() 的一些主要区别如下:

序列号strtok()strtok_r()
1.它用于将字符串 str 分割成一系列标记。它用于将字符串解码为标记的模式。
2.语法如下:char *strtok(char *str, const char *delim)其语法如下:char *strtok_r(char *string, const char *limiter, char **context);
3.它使用 分隔符 进行处理。它是 strtok() 的可重入变体。
4.它接受两个参数。它接受三个参数。
5.它返回字符串中找到的第一个标记的指针。它返回字符串中找到的第一个标记的指针。
6.它不是线程安全的。它是线程安全的。

strtok_r() 的优点

C 和 C++ 中的 strtok() 函数的一个版本是 strtok_r() 方法,它可以使用该方法将字符串()标记化(分割)成更小的子字符串。Strtok_r() 是线程安全和可重入的,使其在多线程或可重入应用程序中更安全。strtok()strtok_r() 之间的主要区别在于 strtok_r() 是线程安全和可重入的。使用 strtok_r() 的优点如下:

  1. 线程安全:与使用静态内部指针来跟踪当前解析位置的 strtok() 不同,Strtok_r() 需要您提供一个指向 saveptr 参数的指针。因此,strtok_r() 可以并发调用而不会干扰其他线程,因为每个线程都可以拥有自己的 saveptr,这使得 strtok_r() 线程安全。
  2. 可重入性:由于 strtok_r() 是可重入的,因此可以安全地从信号处理程序或嵌套函数调用中调用它,而不会影响其他字符串的解析方式。它提高了其在复杂程序框架中的适应性。
  3. 可预测行为:与依赖隐藏静态指针的 strtok() 函数相比,strtok_r() 的行为更容易理解和预测,因为 saveptr 指针是明确提供的。这可以使使用 strtok_r() 函数的代码更容易调试和维护。
  4. 可移植性:Strtok_r() 是 POSIX 标准 (IEEE Std 1003.1) 中指定的标准化函数,使其在多个平台和系统上具有更好的可移植性。Strtok() 在大多数 C 和 C++ 库中广泛可用且得到支持。
  5. 自定义解析:通过使用不同的分隔符和相同的 saveptr 重复调用 strtok_r(),您可以对具有多个分隔符的文本进行标记化。处理复杂输入数据时,这种灵活性可能很有用。

结论

总之,对于多线程或可重入上下文中的字符串标记化,strtok_r()strtok() 更安全、更灵活的替代方案。在这些情况下,它显式的 saveptr 参数和线程安全性使其成为最佳选择。