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 中引入,但并非所有編譯器都支持)或自己實現一個線程安全的字符串分割函數。