📅  最后修改于: 2023-12-03 15:23:22.283000             🧑  作者: Mango
strtok()函数可以将字符串分割成若干个子串,其原理是:第一次调用时,strtok()函数需要传入要分割的字符串和分隔符,函数会找到第一个分隔符,并把其前面的字符串返回给调用者。同时,函数会将原来的字符串改为从分隔符开始的字符串。下次调用时,可以不传入原字符串,函数会在原字符串基础上继续分割。如果传入NULL,表示继续上一次的操作。
我们可以使用C++中的类来实现strtok()函数。具体实现步骤如下:
代码如下:
#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()函数,我们可以更加方便地分割字符串,而且还能维护分割状态信息。这样,我们就可以很轻松地实现各种字符串解析器等工具。