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';

  • 相关阅读:
    Unique Binary Search Trees——LeetCode
    Binary Tree Inorder Traversal ——LeetCode
    Maximum Product Subarray——LeetCode
    Remove Linked List Elements——LeetCode
    Maximum Subarray——LeetCode
    Validate Binary Search Tree——LeetCode
    Swap Nodes in Pairs——LeetCode
    Find Minimum in Rotated Sorted Array——LeetCode
    Linked List Cycle——LeetCode
    VR AR MR
  • 原文地址:https://www.cnblogs.com/shenfei2031/p/1987409.html
Copyright © 2011-2022 走看看