zoukankan      html  css  js  c++  java
  • strtok函数相关理解

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

    unsigned
    char map[32];
    int count;

    #ifdef _MT
    _ptiddata ptd
    = _getptd();
    #else /* _MT */
    static char *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';

  • 相关阅读:
    Play Framework + ReactiveMongo 环境搭建
    阿里前端二面(笔试/机试)总结
    ES 6 新特性整理
    Javascript Dom 相关知识整理
    Ajax、CORS、Comet和WebSocket
    XHTML 1.0 标签语义
    Javascript知识整理
    Javascript性能优化(一)
    CSS知识整理
    绘制标准的d3图表
  • 原文地址:https://www.cnblogs.com/shenfei2031/p/1987409.html
Copyright © 2011-2022 走看看