2010-07-30 24 views
3

這是如何工作的?C Tokenizer - 它是如何工作的?

我知道使用它,你在傳:

  • 開始:字符串(如 「第1項,第2項,第3項」)
  • DELIM:分隔字符串(如 「」)
  • TOK:參照一個字符串,將持有令牌
  • nextpos(可選):參照在原始字符串的位置的下一個標記開始
  • sdelim(可選):指針,其將保存的字符開始toke的分隔符ñ
  • edelim(可選):指向將持有令牌

代碼的結束分隔符字符:

#include <stdlib.h> 
#include <string.h> 

int token(char* start, char* delim, char** tok, char** nextpos, char* sdelim, char* edelim) { 
    // Find beginning: 
    int len = 0; 
    char *scanner; 
    int dictionary[8]; 
    int ptr; 

    for(ptr = 0; ptr < 8; ptr++) { 
     dictionary[ptr] = 0; 
    } 

    for(; *delim; delim++) { 
     dictionary[*delim/32] |= 1 << *delim % 32; 
    } 

    if(sdelim) { 
     *sdelim = 0; 
    } 

    for(; *start; start++) { 
     if(!(dictionary[*start/32] & 1 << *start % 32)) { 
      break; 
     } 
     if(sdelim) { 
      *sdelim = *start; 
     } 
    } 

    if(*start == 0) { 
     if(nextpos != NULL) { 
      *nextpos = start; 
     } 
     *tok = NULL; 
     return 0; 
    } 

    for(scanner = start; *scanner; scanner++) { 
     if(dictionary[*scanner/32] & 1 << *scanner % 32) { 
      break; 
     } 
     len++; 
    } 

    if(edelim) { 
     *edelim = *scanner; 
    } 

    if(nextpos != NULL) { 
     *nextpos = scanner; 
    } 

    *tok = (char*)malloc(sizeof(char) * (len + 1)); 

    if(*tok == NULL) { 
     return 0; 
    } 

    memcpy(*tok, start, len); 
    *(*tok + len) = 0; 


    return len + 1; 
} 

我得到的大部分,除了:

dictionary[*delim/32] |= 1 << *delim % 32;

and

dictionary[*start/32] & 1 << *start % 32

它是神奇的嗎?

+0

你爲什麼覺得它的魔力? – ChaosPandion 2010-07-30 14:39:51

+0

我知道這兩行做一些事情來找到分隔符,但它沒有通過分隔符字符串循環? – 2010-07-30 14:42:34

回答

1

的查找它們存儲的字符已經通過使存儲在字典位的8×32 = 256個表發生。

dictionary[*delim/32] |= 1 << *delim % 32; 

設置對應於* DELIM

dictionary[*start/32] & 1 << *start % 32 

檢查位

4

由於分隔符的每個字符都是8位(sizeof(char) == 1個字節),因此它被限制爲256個可能的值。

字典被分成8片(int dictionary[8]),每片32點的可能性(sizeof(int)是> = 4個字節)和32×8 = 256。

這形成值的256位的矩陣。然後打開分隔符中每個字符的標誌(dictionary[*delim/32] |= 1 << *delim % 32;)。該數組的索引爲*delim/32,或者該字符的ASCII值除以32.由於ASCII值的範圍是0到255,因此該除法產生一個值爲0到7的餘數。其餘的是打開哪個位,由模數運算決定。

如果相應的ASCII字符存在於分隔符中,所有這些都會將256位矩陣的某些位標記爲真。

然後確定字符是否在分隔符是簡單地在256位的矩陣(dictionary[*start/32] & 1 << *start % 32

0

OK位,所以如果我們的字符串","在發送的delimiter然後dictionary[*delim/32] |= 1 << *delim % 32dictionary[1] = 4096。表達式dictionary[*start/32] & 1 << *start % 32只是檢查匹配的字符。

我困惑的是爲什麼他們沒有使用直接的char比較。