strtok_r和strtok函数
时间: 2023-11-15 14:56:08 浏览: 97
strtok和strtok_r都是用来分割字符串的函数,但是它们有一些区别。strtok函数使用一个静态变量来保存上一次分割的位置,因此在多线程环境下可能会出现问题。而strtok_r函数则需要传入一个指向保存上一次分割位置的指针,因此可以在多线程环境下安全使用。
下面是一个使用strtok函数分割字符串的例子:
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello,world";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
return 0;
}
```
输出结果为:
```
hello
world
```
相关问题
strtok和strtok_r
strtok()和strtok_r()都是用于字符串分割的函数。
strtok()函数使用一个静态缓冲区来进行解析,因此不是线程安全的。如果线程安全对你很重要,那么应该使用strtok_r()函数。
strtok_r()函数是strtok()的可重入版本。saveptr参数是一个指向char *变量的指针,它在strtok_r()内部用于在解析相同字符串的连续调用之间维护上下文。
strtok_r()函数
`strtok_r()` 是 C 语言中的一个库函数,它是一个线程安全版本的 `strtok()` 函数,用于在字符串中按照指定的分隔符进行分割。`strtok()` 原本是非线程安全的,可能会导致数据竞争问题,特别是在多线程环境下使用。
`strtok_r()` 函数原型如下:
```c
char* strtok_r(char* str, const char* delimiters, char** saved_ptr);
```
参数说明:
- `str`: 需要被分割的字符串。
- `delimiters`: 分隔符字符串,可以包含多个字符。
- `saved_ptr`: 这是一个指向之前 `strtok()` 返回结果的指针,如果连续调用,可以传入上一次的返回值,以便从上次结束的位置继续分割。
函数执行流程:
1. 首次调用时,将 `str` 和 `NULL` 作为 `str` 和 `saved_ptr` 参数,函数会从 `str` 开始分割并返回第一个分隔后的子串。
2. 下次调用时,将上一次返回的子串传递给 `str` ,`saved_ptr` 指向 `str` 在原字符串中的起始位置,继续分割剩余部分。
注意,每次调用 `strtok_r()` 后,它会在原始字符串中留下一个空格,所以下次调用时会从上一个空格之后开始。
阅读全文