乐闻世界logo
搜索文章和话题

C : correct usage of strtok_r

5 个月前提问
4 个月前修改
浏览次数71

1个答案

1

在 C 语言中,strtok_r 是一个用于分割字符串的函数,它是 strtok 的线程安全版本。这意味着 strtok_r 可以在多线程程序中安全使用,而 strtok 则可能会导致问题,因为它使用静态存储区来保存上次调用后的剩余字符串。

strtok_r 函数原型:

c
char *strtok_r(char *str, const char *delim, char **saveptr);
  • str: 要分割的原始字符串,在第一次调用时指向要分割的字符串,后续调用应设为 NULL。
  • delim: 包含分隔符的字符串,这些分隔符用来切割原始字符串。
  • saveptr: 用于保存字符串的剩余部分,供函数的下一次调用使用。

使用示例:

假设我们有一个任务是分割一行文本,该文本中的单词由空格分开。

c
#include <stdio.h> #include <string.h> int main() { char input[] = "Hello world this is an example"; char *token; char *rest = input; while ((token = strtok_r(rest, " ", &rest))) { printf("Token: %s\n", token); } return 0; }

在这个示例中:

  1. input 字符串包含我们需要分割的原始文本。
  2. 我们通过 strtok_r 在一个 while 循环中逐步获取每个单词(以空格为分隔符)。
  3. 第一个参数在第一次调用时是待分割的字符串 input,之后为了获取剩余的子字符串,我们将其设为 NULL。
  4. delim 参数是一个包含单个空格字符的字符串,表示分隔符。
  5. saveptr 参数在调用过程中保存剩余部分的位置,供下一次调用使用。

注意事项:

  • 在多线程环境中使用 strtok_r 而不是 strtok,以避免竞态条件和其他线程安全问题。
  • 在使用 strtok_r 分割字符串后,原始字符串 input 会被修改,因为 strtok_r 会在每个分隔符处插入 '\0'。

通过这个例子和解释,您可以看到 strtok_r 如何在实际程序中用于安全地分割字符串,尤其是在需要线程安全的情况下。

2024年6月29日 12:07 回复

你的答案