strtok_r与 strtok的区别
时间: 2024-04-23 07:21:06 浏览: 101
strtok和strtok_r都是C语言中用于字符串分割的函数,它们的主要区别在于线程安全性。
1. strtok函数:
strtok函数用于将一个字符串按照指定的分隔符进行分割。它会修改原始字符串,将分隔符位置替换为字符串结束符'\0',并返回分割后的子字符串的指针。但是,strtok函数是不可重入的,也就是说在多线程环境下使用时可能会导致不可预料的结果。
2. strtok_r函数:
为了解决strtok函数不可重入的问题,strtok_r函数被引入。它与strtok函数的用法相同,但是额外接受一个指向保存上一次分割位置的指针的参数,通过这个参数来保证线程安全。每次调用strtok_r函数时,需要传递上一次返回的指针作为参数。
总结一下:
- strtok函数不是线程安全的,而strtok_r函数是线程安全的。
- strtok函数会修改原始字符串,而strtok_r函数不会。
- strtok_r函数需要额外传递一个指向上一次分割位置的指针作为参数。
相关问题
strtok_r函数用法
strtok_r函数是一个字符串分割函数,用于将一个字符串按照指定的分隔符进行分割,并返回分割后的子字符串。它的用法如下:
```c
char *strtok_r(char *str, const char *delim, char **saveptr);
```
其中,参数说明如下:
- `str`:要分割的字符串。
- `delim`:分隔符字符串,可以包含多个字符。
- `saveptr`:保存分割状态的指针,需要传入一个指向char指针的变量的地址。
函数的返回值为分割后的子字符串,如果没有找到分隔符,则返回NULL。
使用strtok_r函数进行字符串分割的一般步骤如下:
1. 第一次调用时,将待分割的字符串传入str参数。
2. 后续调用时,将str参数设置为NULL。
3. 在每次调用时,会返回一个子字符串,并将saveptr指向下一个子字符串的起始位置。
下面是一个示例代码:
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World! CSDN";
const char delim[] = " ,!";
char *token;
char *saveptr;
token = strtok_r(str, delim, &saveptr);
while (token != NULL) {
printf("%s\n", token);
token = strtok_r(NULL, delim, &saveptr);
}
return 0;
}
```
输出结果为:
```
Hello
World
CSDN
```
c语言 strtok_r
`strtok_r()` 是 C 语言标准库中的一个安全版本 of `strtok()` 函数,用于按指定分隔符分割字符串。相比于 `strtok()`,它有以下几个关键优势[^1]:
1. **安全性**:`strtok_r` 不会修改全局或静态变量,这对于多线程环境至关重要,因为它避免了不同线程之间的潜在竞争条件。
2. **内存管理**:`strtok_r` 使用了一个可变参数 `&saveptr` 来保存之前 `strtok_r` 的状态,这样每次调用时都可以独立于原始字符串,从而减少了副作用。
下面是使用 `strtok_r` 的示例:
```c
#include <stdio.h>
#include <string.h>
int main() {
char string[50] = "Hello,world,this,is,a,test";
char *token;
char *saveptr;
token = strtok_r(string, ",", &saveptr);
while (token != NULL) {
printf("%s\n", token);
token = strtok_r(NULL, ",", &saveptr);
}
return 0;
}
```
在这个示例中,`strtok_r` 会返回每个找到的子串,直到整个字符串被遍历完毕或遇到空字符为止。当再次调用 `strtok_r(NULL, ",")` 时,它会从上一次停止的地方继续,除非 `saveptr` 指向了新的分隔符。
阅读全文