unsigned char map[32];
/*str:原始字符串,ctrl:分割字符串*/
/* Set bits in delimiter table */
do {
map[*ctrl >> 3] |= (1 << (*ctrl & 7));
} while (*ctrl++);
while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )
str++;
第一个map是一个对照表。为什么选择了32呢?(可以先看下文)每个下标对应8位,每个char为8bit,有256个字符。32*8=256,刚好等于
第二个do..while构造map表,仿佛如下:
*ctrl>>3,除以8,那么每个下标对应的就有8个目标。比如下标0对应着0~7,下标1对应着8~15
*ctrl & 7,取低3位,进行移位。
这里一个巧的地方就是一个进制的换算。char刚好是8位,而每个数组存放的范围是小于8的倍数,比如上提到的0~7。那么在这个范围内,每个值刚好可以对应一个bit.然后再将这些bit进行一个掩码的组合。
第三个while,是一个比较,对str采取一个统一的处理,首先除8找到下标,然后将对应的字符于map进行一个&,如果str中也有这个字符,则符合条件,进行下一轮。
那么根据这些掩码限制,strtok一些性质可以得到如下:
如果ctrl字符顺序和str顺序即时不符合,也会返回;
最多支持8个ctrl的长度;
测试代码一:
int _tmain(int argc, _TCHAR* argv[])
{
char s[]="1111 2222 333";
char *d=" ";
char *p;
p=strtok(s,d);
while(p)
{
printf("%s\n",p);
p = strtok(NULL,d);
}
return 0;
}
/*
输出
*/
1111
2222
333
测试代码二:
int _tmain(int argc, _TCHAR* argv[])
{
char s[]="1111ab2222ba333";
char *d="ab";
char *p;
p=strtok(s,d);
while(p)
{
printf("%s\n",p);
p = strtok(NULL,d);
}
return 0;
}
/*
输出
*/
1111
2222
333
测试三
int _tmain(int argc, _TCHAR* argv[])
{
char s[]="1111abcdefghi2222iabcdefgh333";
char *d="abcdefgh";
char *p;
p=strtok(s,d);
while(p)
{
printf("%s\n",p);
p = strtok(NULL,d);
}
return 0;
}
/*
输出
*/
1111
i2222i
333
结尾,这种内容上的技巧可以经常在库代码中看到。而且现在似乎也只能在库代码中看到,在看完无数的数组遍历诸如代码之后,这些不是非常高深的技巧却经常让人嗟呼不已。计算机性能的发展远远落后人类的需求,并不能依靠硬件性能就开始一浆糊的写代码。 如果你一浆糊了,你的后来人还能说硬件性能如何,不考虑什么什么如何这句话吗?当然我不想扯得多高深,涉及到整个行业的进步上去。但也不是说去忽视计算机的性能。硬件性能的便利,使我们可以写出更人性化的代码,少掉许多奇淫技巧,可以去思考和拓展更多的东西,但是切忌浆糊式的代码出来。多锻炼自己的脑子,才能显得稍微灵光点。反正,我是不想变得和你一样。
分享到:
相关推荐
strtok 实现 原代码strtok 实现 原代码strtok 实现 原代码strtok 实现 原代码strtok 实现 原代码strtok 实现 原代码strtok 实现 原代码strtok 实现 原代码strtok 实现 原代码strtok 实现 原代码
strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok函数的用法strtok...
strtok的缺陷,使用strtok_s函数更新安全度 #include "stdafx.h" #include "Windows.h" #include #include using namespace std; char string1[] = "A string\tof ,,tokens\nand some more tokens"; char ...
char *strtok(const char *strToken, const char *strDelimit) 将strToken中以字符串strDelimit进行分割.vs2010测试通过
习题 1、出于练习的目的,strtok和strtok_r函数非常值得自己动手实现一遍,在这个过程中不仅可以更深刻地理解这两个函数的工作原理,也为...代码是自己实现的strtok和strtok_r函数,调用和使用方法与库函数的相同。
在C++编程语言中,对于字符的处理,可以通过使用C++ strtok来进行具体的操作。那么正确的应用方法我们将会在这篇文章中为大家详细介绍,希望能对大家有所帮助,提高实际程序开发效率。
strtok使用範例,可幫助C之初學者對程式學習上有些許幫助。 建議軟體VS 2005/2008
strrchr strtok_r C库函数使用
1、本文详细描述了c语言strtok函数的用法。 2、通过详细示例,让读者更直观地阅读,更清晰的理解。 3、示例代码可直接复制,编译后可直接运行。 4、根据示例以及运行结果,让读者加强记忆及理解。
主要介绍了C语言切割多层字符串的方法,说了strtok的弱点,使用strtok_r的方法
相对于explode()来说,strtok()函数可以控制节奏。按需切割字串。
strtok.txt
函数原型:char *strtok(char *s, char *delim) 功能:作用于字符串s,以delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。
strtok函数是字符串函数库中的一个函数,函数原型如下: char *strtok(char s[], const char *delim); 作用:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。 例如:”hello,hi:what?is!the....
标记解析(`Tokenizing`)是最简单也是最常见的解析问题,也就是根据分隔符把一个字符串分割为几个部分。这个定义覆盖了所有这种类型的任务。根据空白分隔符(例如`" \t\n\r"`之一)分割单词。假设有个像`"/usr/...
函数原型:char *strtok(char *s, const char *delim);Function:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。Description:strtok()用来将字符串分割成... 代码如下:#include <iostream> #inclu
原字符串中包含浮点数、逗号、字符串、整数,长整型数等,本程序实现的是取出其中的浮点数和长整型数