[英]C Tokenize String
我试图在保留分隔符的同时用分隔符标记字符串。 我尝试使用strtok(string, delimiters)
但是该函数未保留定界符。 例如,如果我的字符串是:
"my name < is|John >hi"
当我看到符号"space", "<", ">"
时,我想拆分。
令牌将是:
my, space, name, space, < , space, is, |, John, space, <, hi
最初,我尝试逐字符读取char,直到看到分隔符。 如果没有看到符号,则将read char附加到字符串之前。 例如,对于字符串“ hi | bye”。 我会读“ h”,然后读下一个字符。 其为“ i”,因此将其附加到“ h”。 阅读下一个符号,它是一个定界符,因此将“ hi”放入数组中,还将“ |”放入数组中 排列成一个数组。 重复直到完成。 我遇到了这样做的问题。
这是我的代码不起作用:
int main()
{
char *line = "command1 | command2 command3 > command4 < command5";
do_tokenize(line);
return 0;
}
void do_tokenize(char *line)
{
char *tokenized[100];
char token[100];
int tokenCounter = 0;
int tokenLength = 0;
int i;
int newToken = 1;
int tokenNum = 0;
for(i=0; line[i] !='\0'; i++)
{
if(line[i] != ' ' && line[i] != '<' && line[i] != '>' && line[i] != '|')
{
token[tokenLength] = line[i];
tokenLength++;
newToken = 1;
}
else
{
if(newToken == 1)
{
token[tokenLength] = '\0';
tokenized[tokenNum] = token;
tokenLength = 0;
tokenNum++;
newToken = 0;
token[tokenLength] = line[i];
token[tokenLength+1] = '\0';
tokenized[tokenNum] = token;
tokenLength = 0;
tokenNum++;
}
else
{
token[tokenLength] = line[i];
token[tokenLength+1] = '\0';
tokenized[tokenNum] = token;
tokenLength = 0;
tokenNum++;
newToken = 0;
}
}//end else
}//end for
token[tokenLength] = '\0';
tokenized[tokenNum] = token;
tokenNum++;
//print is saying that all of tokenized[j] is the last token ie command5
int j=0;
for(j; j<tokenNum; j++)
printf("%s\n", tokenized[j]);
}
当我尝试打印出整个数组(tokenized [j])时,它说的只是最后一个标记"command5"
。 这是用C
完成的。
这将是一个在调试器中运行的好程序,它可以了解它的作用以及如何出错。
如果您使用某种类型的IDE(集成开发环境),则可能要做的就是按下“进入”按钮。
如果使用的是gcc,则可以通过在gcc命令中添加-g
来轻松使用gdb:
$ gcc -g myprog.c -o myprog
$ gdb myprog
(gdb) start
Temporary breakpoint 1 at 0x4009d1
Starting program: myprog
Temporary breakpoint 1, 0x00000000004009d1 in main ()
(gdb) step
Single stepping until exit from function main,
which has no line number information.
...
看来您希望令牌化数组的元素指向在“行”中找到的每个令牌。 代码忠实地将令牌的每个字符复制到char数组“令牌”。 将整个令牌加载到“令牌”中后,该令牌将终止为零。
-
所有这些都很好。 但是,下一步似乎是代码存在缺陷的地方。 然后将标记化数组中的下一个ponter指向“ token”。 问题是“令牌”是您的工作存储,并且“令牌”的内容针对每个新令牌重新生成。
-
最后,“ tokenize”数组中所有受影响的指针都指向同一位置;具体地说,它们都指向“ token”,当然,“ token”的内容是最后解析的令牌。
-
因此,在打印出“令牌”数组时,它们都指向“令牌”,并且令牌的内容是最后解析的令牌(“ Command5”)...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.