阅读量:0
strtok_r
是 C++ 标准库中的一个函数,用于将字符串分割成一系列的子字符串(tokens)
strtok_r
的原型如下:
char* strtok_r(char* str, const char* delim, char** saveptr);
参数说明:
str
:要分割的字符串。在第一次调用时,传入要分割的字符串;在后续调用时,传入nullptr
。delim
:包含分隔符的字符串。strtok_r
会根据这些分隔符来分割输入字符串。saveptr
:一个指向字符指针的指针,用于保存上次分割的位置。在第一次调用时,应将其初始化为nullptr
。
strtok_r
的工作原理如下:
- 如果
str
不为nullptr
,则将str
设置为当前要处理的字符串,并将saveptr
设置为str
。 - 跳过
saveptr
指向的字符串中的所有分隔符。 - 如果已经到达字符串末尾,返回
nullptr
。 - 否则,找到下一个分隔符,并将其替换为字符串终止符(
\0
)。 - 返回
saveptr
指向的子字符串。 - 更新
saveptr
,使其指向下一个非分隔符字符。
下面是一个简单的示例,展示了如何使用 strtok_r
分割字符串:
#include<iostream> #include <cstring> int main() { char str[] = "Hello, world! This is a test."; const char* delim = " ,.!"; char* saveptr = nullptr; char* token = std::strtok_r(str, delim, &saveptr); while (token != nullptr) { std::cout<< token<< std::endl; token = std::strtok_r(nullptr, delim, &saveptr); } return 0; }
输出:
Hello world This is a test
需要注意的是,strtok_r
会修改输入字符串,因此在使用它之前,最好先创建一个字符串的副本。另外,strtok_r
不是线程安全的,因为它使用一个静态变量来保存上次分割的位置。如果需要在多线程环境中使用类似的功能,可以考虑使用 strtok_s
(在 C++17 中引入,但并非所有编译器都支持)或自己实现一个线程安全的字符串分割函数。