我试图用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);
}
}
}
答案 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;
}