/*
实现strtok
*/
/*
解题报告:
1、用二进制中每位记录分隔字符
对注释1的解释: 因为数组中每个下标记录8位(每个下标能记录8种状态),因此右移3位
(3位表示十进制的8)因为数组中每个元素表示8位,因此将分隔符与7做&运算,这样得
到的结果也就有8种状态,对应上了8位,再右移相应的位数,正好将8位中相应的位设置上
做 | 运算是因为不去影响其他的位
*/
/*
Author: Unimen
Date: 27/09/2011 19:29
Description: 实现strtok
*/
#include <iostream>
#include <cstring>
using namespace std;
char *mystrtok(char *strStr, const char *control)
{
int i;
const char *ctrl = control;
char *str = NULL;
static char *nextoken = NULL; //static具有记忆功能,下次执行函数时依然有效
char map[32]; //256位的位图,用来记录分隔字符中的每个字符,注意这个技巧
for (i=0; i<32; ++i)
{
map[i] = 0;
}
//将分隔符记录到map数组中
do
{
map[*ctrl>>3] |= (1<<(*ctrl&7)); //注释1
}while (*ctrl++);
if (strStr)
{
str = strStr;
}
else
{
str = nextoken;
}
//去除开头的分隔字符
while ((map[*str>>3] & 1<<(*str&7)) && *str)
{
++str;
}
strStr = str;
for (; *str; ++str)
{
//如果字符串中的字符为分隔字符,就进行分隔
if (map[*str>>3] & (1<<(*str&7)))
{
*str++ = '\0';
break;
}
}
//用static变量记下str的位置
nextoken = str;
//返回分隔后的字符串
if (strStr == str)
return NULL;
else
return strStr;
}
int main()
{
char test[] = "Hello world! haha!";
char *control = " ";
char *p = NULL;
p = mystrtok(test, control);
while (p)
{
cout<<p<<endl;
p = mystrtok(NULL, control);
}
return 0;
}
实现strtok
最新推荐文章于 2023-05-06 23:35:09 发布