基本的简单标记器

时间:2015-09-14 13:33:29

标签: c algorithm

我试图用C写一个基本的简单标记器。 我在算法中遇到问题,字符串令牌没有指向正确的令牌。

以下是我的实施

char *test="root/ahmed/tolba";

Tokenize(test, '/');

...

void Tokenize(char* String, char Split)
{
    char *strings = String;
    for (size_t i = 0, j = 0; String[i] != 0; i++)
    {
        if (String[i] == Split)
        {
            const char * token = &strings[j];
            size_t length = i-j;
            j=i+1;
            printf(token);
        }           
    }           
}

3 个答案:

答案 0 :(得分:3)

很难看到您提出的问题,但可能您想要打印长度为token的字符串length

使用printf如下:

printf("%.*s\n", length, token);

该语法(%.*s)允许您指定要打印的数量。

答案 1 :(得分:0)

  

令牌没有真正指向正确令牌的问题,我   需要它保持当前令牌而不指向其长度

我不知道你的意思。但这是我刚刚一起攻击的版本:

#include <stdio.h>
#include <string.h>

void Tokenize(char*string,char split)
{
        size_t last_length;
        char*begin = string,*end;

        /*Search for all occurances.*/
        while((last_length = strlen(begin))
        && (end = memchr(begin,split,last_length)))
        {
                printf("%.*s\n",(int)(end - begin),begin);
                begin = end + 1;
        }

        /*Print rest.*/
        if(last_length)
        {
                printf("%.*s\n",(int)last_length,begin);
        }
}

int main(void)
{
        char *test="root/ahmed/tolba";

        Tokenize(test, '/');
}

正如我所说的那样,很快就会被黑客攻击,但应该这样做。 如果这对您没有帮助,我恐怕您将不得不尝试改善您的英语并准确描述您的问题。

答案 2 :(得分:0)

以下代码可能对您有所帮助。它是代码的修改形式。

void showToken(char *  String, char Split){
        int elementNumber,tokenPtr;
        char *token;
        for ( elementNumber = 0, tokenPtr = 0; String[elementNumber] != 0; elementNumber++){
                if ( String[elementNumber] == ' ' )
                {
                        token = &String[tokenPtr];
                        fprintf(stderr,"%.*s\n",(elementNumber-tokenPtr), token);
                        tokenPtr = elementNumber+1;
                }
        }
        token = &String[tokenPtr];
        fprintf(stderr,"%.*s\n",(elementNumber-tokenPtr), token);
        tokenPtr = elementNumber;
}