转自:http://blog.csdn.net/mormont/article/details/53677363
#include "iostream"
#include "algorithm"
#include "map"
using namespace std;
char *strtok(char *str, const char *delim)
{
static char *last = NULL; // 上一次非分隔字符串字
const char *cpdelim = delim; // 对delim做一个备份
bool show = false; // 标记已出现感兴趣字符
bool first = true; // 第一次出现感兴趣字符
char *tok = NULL; // 程序的返回值
if(str == NULL)
str = last; // 若str为NULL则表示该程序继续处理上一次余下的字符串
for(; *str; str++)
{
delim = cpdelim;
for(; *delim; delim++)
{
if(*str == *delim)
{
*str = '\0'; // 若找到delim中感兴趣的字符, 将该字符置为NULL
show = true;
break;
}
}
if(*str != '\0' && first)
{
tok = str; // 只记录下当前第一个非感兴趣字符的位置
first = false;
}
if(*str != '\0' && !first && show)
{
last = str; // 第二次出现非感兴趣字符的位置
return tok;
}
}
// 执行该句表明一直未出现过感兴趣字符,
// 或者说在出现了感兴趣的字符后, 就没再出现过非感兴趣字符
last = str;
return tok;
}
int main()
{
char s[] = "ab-cd : ef;gh :i-jkl;mnop;qrs-tu: vwx-y;z";
char *delim = "-: ";
char *p;
cout << strtok(s, delim) << " ";
while(p = strtok(NULL, delim))
cout << p << " ";
cout << endl;
return 0;
}