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

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

在C++中实现strtok()函数

介绍

strtok()函数可以将字符串分割成若干个子串,其原理是:第一次调用时,strtok()函数需要传入要分割的字符串和分隔符,函数会找到第一个分隔符,并把其前面的字符串返回给调用者。同时,函数会将原来的字符串改为从分隔符开始的字符串。下次调用时,可以不传入原字符串,函数会在原字符串基础上继续分割。如果传入NULL,表示继续上一次的操作。

实现

我们可以使用C++中的类来实现strtok()函数。具体实现步骤如下:

  1. 定义一个类Token,用于维护上一次分割留下的状态信息。
  2. 定义Token类的构造函数和成员函数,用于把字符串分割成若干个子串。

代码如下:

#include <iostream>
#include <cstring>

using namespace std;

class Token {
public:
    Token(char *str, char *sep) {
        m_str = str;
        m_sep = sep;
        m_context = NULL;
    }

    char *next() {
        char *p;
        if (m_str == NULL)
            m_str = m_context;

        p = strpbrk(m_str, m_sep);
        if (p != NULL) {
            *p = '\0';
            m_context = p + 1;
        } else {
            m_context = NULL;
        }
        return m_str;
    }

private:
    char *m_str;
    char *m_sep;
    char *m_context;
};

int main() {
    char str[] = "abc,def,ghi";
    char sep[] = ",";
    Token tk(str, sep);

    char *tmp = tk.next();
    while (tmp != NULL) {
        cout << tmp << endl;
        tmp = tk.next();
    }

    return 0;
}
解释

首先,我们定义了一个类Token,用于维护上一次分割留下的状态信息。在Token的构造函数中,我们传入了要分割的字符串和分隔符,并初始化m_context为NULL。

在next()函数中,我们首先判断是否是第一次调用,如果是,我们就从m_str开始分割;否则,我们就从m_context开始分割,这样保证了第二次分割能够继续上一次的操作。

接着,我们调用了C++字符串库中的strpbrk()函数,查找m_str中是否存在分隔符,如果存在,就将分隔符改为'\0',并将分割后的字符串的地址返回,同时将m_context指向下一个分隔符的位置;否则,我们就将m_context设置为NULL,表示已经分割到结束。

最后,我们可以使用while循环,不断调用Token的next()函数,并输出分割后的字符串,直到返回值为NULL,表示已经分割到结束。

总结

通过用C++类来实现strtok()函数,我们可以更加方便地分割字符串,而且还能维护分割状态信息。这样,我们就可以很轻松地实现各种字符串解析器等工具。