2015-09-15 32 views
2

我是C新手,我有一个代码,但我不明白它的一部分。解释字符串的C代码tokenizer

typedef struct 
{ 
    size_t count; 
    char** strings; 
} Tokens; 

Tokens Tokenize(char* String, char Split) 
{ 
    Tokens t; 
    t.count = 1; 

    for (size_t i = 0; String[i] != 0; i++) 
    { 
     if (String[i] == Split) 
      t.count++; 
    } 

    t.strings =(char**) malloc(sizeof(char*)* t.count); 

    if (t.count > 0) 
     t.strings[0] = String; 

    for (size_t i = 0, j = 1; String[i] != 0; i++) 
    { 
     if (String[i] == Split) 
     { 
      t.strings[j] = &String[i + 1]; 
      String[i] = 0; 
      j++; 
      i++; 
     } 
    } 
    return t; 
} 

,我不理解的部分是一个指针如何指针炭可以标记化弦形部分,尤其是线t.strings [J] = &字符串第[i + 1];

如果有人可以请让过程可视化,我将不胜感激。 谢谢

+0

使用调试器并逐步执行代码。你有你的“可视化”。 “寻求调试帮助的问题(”为什么这个代码不工作?“)必须包含所需的行为,特定的问题或错误以及在问题本身中重现问题所需的最短代码。给其他读者。请参阅:如何创建[mcve]。“如果有效,无论如何这都是OT,我们不是代码解释站点 - 对不起。 – Olaf

+2

@Olaf“寻求调试帮助的问题(”为什么不是这个代码工作?“)....” - 你在开玩笑吗?据我可以告诉你,他不寻求调试帮助,这个代码可能工作。从什么时候我们不是代码解释站点?这就是为什么SO在那里向人们解释事情的原因。 – Quest

+0

@查询谢谢!你的评论太多了 – andre

回答

1

特别是那行t.strings [j] = & String [i + 1];

在该行,String[i]是分隔符字符(Split)找到,因此String[i + 1]处于下一个标记字符串的开头的炭。那么char(&String[i + 1])的地址就是下一个标记字符串的字符串指针/地址。

t.strings[]只是在String中找到的字符串指针的集合(数组)。

+0

是的,但如何&字符串[i + 1],标记字符串?如果它指向下一个标记,那么在该标记之前的前一个字符串会发生什么?它如何被保存,以便它现在被视为一个令牌?你可以放一张照片吗? – andre

+1

'String'是一串字符的地址。我们使用“abcXdefXanotherXtoken”,其中'X'是分割字符。随着循环的进行,这些字符变为“abc_defXanotherXtoken”(其中'_'表示我无法打印的空白),然后是“abc_def_anotherXtoken”,最后是“abc_def_another_token”。 't.string []'数组的目的是记录在“def”中找到'd',在“another”中找到'a',在“token”中找到't'。这些地址是字符串指针。 – donjuedo

+1

令牌字符串保留在他们开始的地方。替换Split的空值现在也作为令牌字符串的空终止字符。 – donjuedo