• 《程序员求职成功路》之字符串__strtok函数相关理解【转载】


    程序员求职成功路这本书,不错。其中第三章数据结构与算法,介绍了几种操作字符串的函数,面试时让自己实现撒:

    char* __cdecl strtok (char*string,constchar* control)
    {
    unsigned
    char*str;
    const unsigned char*ctrl = control;

    unsigned
    char map[32];
    int count;

    #ifdef _MT
    _ptiddata ptd
    = _getptd();
    #else /* _MT */
    staticchar*nextoken;
    #endif /* _MT */

    /* Clear control map */
    for (count =0; count <32; count++)
    map[count]
    =0;

    do{
    map[
    *ctrl >>3] |= (1<< (*ctrl &7));
    }
    while (*ctrl++);

    if (string)
    str
    =string;
    else
    #ifdef _MT
    str
    = ptd-> _token;
    #else /* _MT */
    str
    = nextoken;
    #endif /* _MT */

    while ( (map[*str >>3] & (1<< (*str &7))) &&*str )
    str
    ++;

    string= str;

    for ( ; *str ; str++ )
    if ( map[*str >>3] & (1<< (*str &7)) ) {
    *str++='\0 ';
    break;
    }

    #ifdef _MT
    ptd
    -> _token = str;
    #else /* _MT */
    nextoken
    = str;
    #endif /* _MT */

    if ( string== str )
    return NULL;
    else
    return string;
    }

    原型:extern char *strtok(char *s, char *delim);
    用法:#include <string.h>
    功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。  
    说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。
    strtok在s中查找包含在delim中的字符并用NULL( '\0 ')来替换,直到找遍整个字符串。
    返回指向下一个标记串。当没有标记串时则返回空字符NULL。

    map[*ctrl >> 3] |= (1 << (*ctrl & 7));

    首先map[32]是个uchar型数组,数组每一个是8位,其中每一位可以表示一个字符,32×8=256,这样的话,map[32]中有256个bit,每个bit表示一个ASCII码,那么可以表示256个ASCII码。  
    *ctrl >> 3,表示将安ascii码,给其分类,*ctrl >> 3表示,除以8的意思,将ascii每八位分为一组,也就是map[32]中的一个。  
    1 << (*ctrl & 7),这个是这样的意思,7表示为二进制就是00000111,这样的话,相当于是一个数除以8后剩余的余数。1 << (*ctrl & 7),就是将二进制00000001,向右移动(*ctrl & 7)个位。 

    map[*ctrl >> 3] |= (1 << (*ctrl & 7)),就是表示将map[*ctrl >> 3]中的(*ctrl & 7)+1位设为1,表示在该位置查询到一个ascii字符。  

    这样做以后,就相当于简历了一个表,只要查询相应的位是否为1,就知道该字符,在strtok的字符串中是否出现过。

    映射前:
    map[6] = 0 | (00000001 << (00110000 & 00000111)
    map[6] = 00000001 //map[6] 是第7组的标志, 一组8个元素。

    验证:

    map[*str > > 3] & (1 < < (*str & 7))
    map[6] & (00000001 << (00110000 & 00000111)
    00000001 & 00000001 = 1 
    验证成功,将下一位设置为*str++ = '\0';

    解释的博客原文地址为:http://www.cnblogs.com/shenfei2031/archive/2011/03/17/1987409.html

  • 相关阅读:
    double保存小数点后两位
    二维数组做函数参数,及地址问题
    解决应用程序无法正常启动0xcxxxxxxxxxx问题
    docker+selenium grid解决node执行经常卡死
    docker+selenium Grid搭建自动化分布式测试环境
    Docker+Selenium Grid+Python搭建分布式测试环境
    xshell无法连接Ubuntu的解决办法
    docker获取镜像很慢解决办法
    django使用ajax传输数据
    $.ajax()所有参数详解
  • 原文地址:https://www.cnblogs.com/slysky/p/2254678.html
Copyright © 2020-2023  润新知