`

strtok三段代码分析

 
阅读更多

 

 

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
结尾,这种内容上的技巧可以经常在库代码中看到。而且现在似乎也只能在库代码中看到,在看完无数的数组遍历诸如代码之后,这些不是非常高深的技巧却经常让人嗟呼不已。计算机性能的发展远远落后人类的需求,并不能依靠硬件性能就开始一浆糊的写代码。 如果你一浆糊了,你的后来人还能说硬件性能如何,不考虑什么什么如何这句话吗?当然我不想扯得多高深,涉及到整个行业的进步上去。但也不是说去忽视计算机的性能。硬件性能的便利,使我们可以写出更人性化的代码,少掉许多奇淫技巧,可以去思考和拓展更多的东西,但是切忌浆糊式的代码出来。多锻炼自己的脑子,才能显得稍微灵光点。反正,我是不想变得和你一样。

 

1
3
分享到:
评论

相关推荐

    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函数的用法strtok函数的用法strtok...

    strtok的缺陷,使用strtok_s函数更新安全度

    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 ...

    strtok函数C实现

    char *strtok(const char *strToken, const char *strDelimit) 将strToken中以字符串strDelimit进行分割.vs2010测试通过

    Linux C编程一站式学习 25章习题_strtok & strtok_r

    习题 1、出于练习的目的,strtok和strtok_r函数非常值得自己动手实现一遍,在这个过程中不仅可以更深刻地理解这两个函数的工作原理,也为...代码是自己实现的strtok和strtok_r函数,调用和使用方法与库函数的相同。

    C++ strtok应用方式浅析

    在C++编程语言中,对于字符的处理,可以通过使用C++ strtok来进行具体的操作。那么正确的应用方法我们将会在这篇文章中为大家详细介绍,希望能对大家有所帮助,提高实际程序开发效率。

    strtok使用範例

    strtok使用範例,可幫助C之初學者對程式學習上有些許幫助。 建議軟體VS 2005/2008

    strrchr strtok_r C库函数使用

    strrchr strtok_r C库函数使用

    C语言strtok函数用法

    1、本文详细描述了c语言strtok函数的用法。 2、通过详细示例,让读者更直观地阅读,更清晰的理解。 3、示例代码可直接复制,编译后可直接运行。 4、根据示例以及运行结果,让读者加强记忆及理解。

    C语言切割多层字符串(strtok_r strtok使用方法)

    主要介绍了C语言切割多层字符串的方法,说了strtok的弱点,使用strtok_r的方法

    PHP strtok()函数的优点分析

    相对于explode()来说,strtok()函数可以控制节奏。按需切割字串。

    strtok.txt

    strtok.txt

    strtok函数的用法大全

    函数原型:char *strtok(char *s, char *delim) 功能:作用于字符串s,以delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。

    strtok函数的使用示例

    strtok函数是字符串函数库中的一个函数,函数原型如下: char *strtok(char s[], const char *delim); 作用:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。 例如:”hello,hi:what?is!the....

    strtok的赞歌.pdf

    标记解析(`Tokenizing`)是最简单也是最常见的解析问题,也就是根据分隔符把一个字符串分割为几个部分。这个定义覆盖了所有这种类型的任务。根据空白分隔符(例如`" \t\n\r"`之一)分割单词。假设有个像`"/usr/...

    C++中strtok()函数的用法介绍

    函数原型:char *strtok(char *s, const char *delim);Function:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。Description:strtok()用来将字符串分割成... 代码如下:#include &lt;iostream&gt; #inclu

    使用strtok函数截取字符串得到相应的子串存入数组中

    原字符串中包含浮点数、逗号、字符串、整数,长整型数等,本程序实现的是取出其中的浮点数和长整型数

Global site tag (gtag.js) - Google Analytics