strtok_r 源码(测试过的,正确的,之前在网上找的内存错误)
2017-08-03 15:27
381 查看
#include<assert.h> #include<stdio.h> #include<iostream> using namespace std; char* strtok_1(char* string_org,const char* demial) { static unsigned char* last; //保存分隔后剩余的部分 unsigned char* str; //返回的字符串 const unsigned char* ctrl = (const unsigned char*)demial;//分隔字符 //把分隔字符放到一个索引表中。定义32是因为ASCII字符表最多是0~255个,也是说用最大的255右移3位,也就是除以8一定会是32中的一个数。 unsigned char map[32]; int count; //把map全部清为0,之后相与的操作,与0的都为0 for (count =0; count <32; count++) { map[count] = 0; } //把匹配字符放入表中 //放入的算法是把匹配字符右移3位,相当于除以8,的数值 并上(加上) //匹配字符与7,得到低3位,得出的结果,是把1左移的位数。最大左移位数是7,也就是所表示的最大值是128, do { map[*ctrl >> 3] |= (1 << (*ctrl & 7)); } while (*ctrl++); //原始字符串是否为空,如果为空表示第二次获取剩余字符的分隔部分。 if (string_org) { str = (unsigned char*)string_org; } else { str = last; } //在表中查找是否有匹配的字符,如果有略过 while ((map[*str >> 3] & (1 << (*str & 7))) && *str) { str++; } //重置需要扫描的字符串 string_org = (char*)str; //开始扫描 for (;*str; str++) { if ( map[*str >> 3] & (1 << (*str & 7))) { *str++ = '\0';//当找到时,把匹配字符填为0,并且把str指向下一位。 break; //退出循环 } } last =str; // 把剩余字符串的指针保存到静态变量last中。 if (string_org == (char*)str) { return NULL; //没有找到,也就是没有移动指针的位置,返回NULL } else { return string_org; //找到了,返回之前字符串的头指针 } } /* */ #include<string.h> #include<stdio.h> #include <iostream> using namespace std; int main(int argc, char * argv[]) { //时间格式 2010/08/11 10:38:22 char strEventTime[] = "2010/08/11 10:38:22\0"; char *token = NULL; token = strtok_1(strEventTime, "/"); char *year = token; if (token != NULL) { token = strtok_1(NULL, "/"); } char *month = token; if (token != NULL) { token = strtok_1(NULL, " "); } char *day = token; if (token != NULL) { token = strtok_1(NULL, ":"); } char *hour = token; if (token != NULL) { token = strtok_1(NULL, ":"); } char *minute = token; if (token != NULL) { token = strtok_1(NULL, ":"); } char *second = token; printf("%s %s %s %s %s %s %s\n", year, month, day, hour, minute, second); return 0; }
相关文章推荐
- 今天在我导入一些安卓项目的源码的时候会出现style.xml 和MAIN.xml 等错误, 网上的方法试了各种clean各种fix等方法都是不能解决。最后去国外论坛得到解决
- 为什么 Redis 重启后没有正确恢复之前的内存数据
- 不正确编译引发内存错误
- (原)red-green Image.合成三维立体效果, 红绿眼镜 3D图 ,三维图片的核心算法。googler.cc上面有完善的程序和源码下载。 网上以前的那个有错误,我纠正了下~!~
- #1094 : Lost in the City(测试用例正确,但提交显示WA,求发现我程序错误)
- 网上对C#/.NET的集合类型的整理,各有错误;这个图,虽不完整细致,但是肯定正确无误
- "opengl编程指南第七版源码(网上下载的)"makefile中的一处错误
- EMC在线测试题目及答案 绿色为正确答案,红色为错误答案
- 用Eclipse打开从网上下载的源码,但都是出现这个错误
- Hadoop-2.8.0集群搭建、hadoop源码编译和安装、host配置、ssh免密登录、hadoop配置文件中的参数配置参数总结、hadoop集群测试,安装过程中的常见错误
- 经常在网上搜怎样获得外网的ip,代码几乎都一样,但测试,都出现错误!最后找了一个既蠢既笨的终极解决方案
- c++调试记录--内存无法访问以及逻辑正确却总是得到错误结果
- 安装DZ时出现“UCenter 的URL地址不正确”错误的解决方案 和首页上部分插入flash图片调用的方法!非网上复制!
- ACM 1000题 A + B Problem(为什么你本地测试正确,提交代码却错误)
- 基于双向链表实现无锁队列的正确姿势(修正之前博客中的错误)
- 错误地正确运行着
- s2sh启动错误,网上说包没全,请大侠帮我看看java.lang.NoClassDefFoundError: org/springframework/asm/ClassVisitor
- 《Advanced Bash-scripting Guide》学习(二):测试脚本调用的参数是否正确
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL
- C程序中常见的内存操作错误