📜  C++中strtok()函数的实现(1)

📅  最后修改于: 2023-12-03 15:29:53.292000             🧑  作者: Mango

strtok() 函数的介绍

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() 函数的实现

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。最后,函数返回当前子字符串的指针。