在 C 语言中,strtok_r
是一个用于分割字符串的函数,它是 strtok
的线程安全版本。这意味着 strtok_r
可以在多线程程序中安全使用,而 strtok
则可能会导致问题,因为它使用静态存储区来保存上次调用后的剩余字符串。
strtok_r 函数原型:
cchar *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; }
在这个示例中:
input
字符串包含我们需要分割的原始文本。- 我们通过
strtok_r
在一个 while 循环中逐步获取每个单词(以空格为分隔符)。 - 第一个参数在第一次调用时是待分割的字符串
input
,之后为了获取剩余的子字符串,我们将其设为 NULL。 delim
参数是一个包含单个空格字符的字符串,表示分隔符。saveptr
参数在调用过程中保存剩余部分的位置,供下一次调用使用。
注意事项:
- 在多线程环境中使用
strtok_r
而不是strtok
,以避免竞态条件和其他线程安全问题。 - 在使用
strtok_r
分割字符串后,原始字符串input
会被修改,因为strtok_r
会在每个分隔符处插入 '\0'。
通过这个例子和解释,您可以看到 strtok_r
如何在实际程序中用于安全地分割字符串,尤其是在需要线程安全的情况下。
2024年6月29日 12:07 回复