#include <iostream>
#include <string.h>
using namespace std;
char *my_strtok(char *dist,const char *src)
{
static char *result;
//此处使用静态变量保存dist,
//为了满足库函数strtok(NULL," ")的实现。
char map[32];
const char *p = src;
memset(map,0,sizeof(map));
while (*p)
{
map[*p >> 3] |= (0x1 << (*p & 0x7));
p++;
}
//ASCII中总共仅仅有256个字符。所以我们将src映射到32个char数组中,
//然后将较低的7位取出作为该数组中8个位中的一位,而且将该位置1。
//表示这个位置存在。在这里要保证唯一确定的一一相应的关系,刚好
//32个char数组就能够满足我们的需求了。
char *q;
if (dist)
q = dist;
else
q = result;
//假设从外部传进来的第一个參数是NULL。那么我们依据上一个參数
//的结束位置開始。这里要用到保存的result变量。 while ((map[*q >> 3] & (1 << (*q & 0x7))) && *q)q++;
//除去前面的多余切割符号。 dist = q; for (; *dist; dist++)
{
if (map[*dist >> 3] & (0x1 << (*dist & 0x7)))
{
*dist='\0';
dist++;
break;
}
//第一次出现制定切割符的地放,然后停止break。
}
result = dist;
//此处result的作用就来了,保存上一次操作的最后一个位置的下一个位置。
//也就是说,假设外面传进来NULL作为第一个參数的话,我们就会从result開始。 return q;
} int main()
{
char s[] = "abc efg hlk";
cout << my_strtok(s, " ") << endl;
cout<<my_strtok(NULL, " ")<<endl;
cout << my_strtok(NULL, " ") << endl;
return 0;
}

最新文章

  1. 自己动手,实现一种类似List&lt;T&gt;的数据结构(一)
  2. IO(七)----转换流
  3. 3d回顾
  4. September 28th 2016 Week 40th Wednesday
  5. 数据结构《9》----Threaded Binary Tree 线索二叉树
  6. I.MX6 uSDHC SD card register
  7. HTML5 Web Speech API 结合Ext实现浏览器语音识别以及输入
  8. 【转】C++中多重继承的二义性及解决办法
  9. Roads in Berland(图论)
  10. 学习笔记(一) HTML+CSS基础课程
  11. Python模块探秘之smtplib,实现纯文本邮件的发送
  12. 安装ruby及sass
  13. P【1012】拼数
  14. Extjs相关知识点梳理
  15. 【shell】正则表达式
  16. Android网络开发之HttpClient
  17. 线上服务器PHP版本编译安装升级全记录
  18. C# string Stream 互转
  19. android Service 保持不被杀死
  20. metaq入门部署到实战

热门文章

  1. CodeForces 144B Meeting
  2. ZOJ 3495 Lego Bricks
  3. 【BZOJ 1095】 1095: [ZJOI2007]Hide 捉迷藏 (括号序列+线段树)
  4. 【动态规划】【二分】Petrozavodsk Winter Training Camp 2017 Day 1: Jagiellonian U Contest, Monday, January 30, 2017 Problem B. Dissertation
  5. Vue实例与渲染
  6. 自定义loading dialog --- 后背景透明
  7. opencv中SiftDescriptorExtractor所做的SIFT特征向量提取工作简单分析
  8. xcode在调试时无法查看变量值
  9. MYSQL复习笔记4-基本SQL语句
  10. HMACSHA1算法的JAVA实现