📅  最后修改于: 2023-12-03 15:29:53.292000             🧑  作者: Mango
strtok()
是 C/C++ 标准库中的字符串函数。它的作用是将字符串切割成若干个子字符串。
char* strtok(char* str, const char* delim);
strtok()
函数接受两个参数:一个指向要分割的字符串的指针和一个用于指示分隔符的字符串。
strtok()
函数在第一次调用时,将该字符串作为参数传递,随后每次调用时传递 NULL
。函数在每一次调用中返回一个指向下一个子字符串的指针。
strtok()
函数会将原字符串修改为分割后的子字符串,这使得第一次子字符串的 '\0'(空字符)出现在被修改的原字符串中。
如果函数无法找到分隔符,则它会在原字符串末尾添加 '\0'(空字符)并返回最后一个子字符串的指针。在这种情况下,原字符串将被修改为仅包含前面已分割的子字符串。
以下是一个简单的 C++ 例子,演示了如何使用 strtok()
函数来分割字符串:
#include <iostream>
#include <cstring>
int main()
{
char str[] = "hello,world";
char* token = strtok(str, ",");
while(token != NULL)
{
std::cout << token << '\n';
token = strtok(NULL, ",");
}
return 0;
}
输出:
hello
world
strtok()
函数的实现相对简单,其根据传入的分隔字符串在原字符串中搜索并返回子字符串的指针。
下面是一个基本的 C++ strtok()
实现:
char* mystrtok(char* str, const char* delim)
{
static char* next_token = NULL;
if(str != NULL) {
next_token = str;
}
if(next_token == NULL) {
return NULL;
}
char* current_token = next_token;
char* delimiter = strpbrk(current_token, delim);
if(delimiter != NULL) {
*delimiter = '\0';
next_token = delimiter + 1;
}
else {
next_token = NULL;
}
return current_token;
}
mystrtok()
函数与标准库函数 strtok()
的区别在于它使用了一个静态指针 next_token
来跟踪下一个子字符串。
在第一次调用时,将要分割的字符串作为参数传递到 mystrtok()
中,并将 next_token
指向该字符串。在随后的每一次调用中,mystrtok()
函数会将该字符串设置为 NULL
,从而使用 next_token
中保存的当前子字符串位置。
函数首先检查 next_token
是否指向了有效的字符串。如果没有,函数返回 NULL
,表示已经处理完毕。如果指向了有效字符串,则在该字符串中搜索要分割的字符集。如果找到,则将分隔符替换成空字符,并将 next_token
设置为下一个子字符串的起始位置。否则,next_token
将被设置为 NULL
。最后,函数返回当前子字符串的指针。