【发布时间】:2014-04-20 04:04:53
【问题描述】:
我试图在保留分隔符的同时通过分隔符标记字符串。我尝试使用strtok(string, delimiters),但该函数不保留分隔符。例如,如果我的字符串是:
"my name < is|John >hi"
当我看到符号"space", "<", ">" 时,我想拆分。
令牌将是:
my, space, name, space, < , space, is, |, John, space, <, hi
起初,我尝试逐个字符地读取字符,直到看到一个分隔符。如果我没有看到符号,我会将读取的字符附加到它之前的字符串中。例如,对于字符串“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 中完成的。
【问题讨论】:
-
tokenized的所有元素都指向同一个地址,即token,这意味着您一次又一次地使用相同的缓冲区,这就是为什么当您打印tokenized时所得到的一切是最后一个令牌。 -
但是我的元素在
tokenized[tokenNum]中,并且在我向数组中添加了一些东西之后,我正在递增tokenNum。而token在我发现它是一个令牌后正在被重写。我还放了打印语句来检查令牌是否正确。 -
每个
tokenized[tokenNum]等于token,而你每次都重写token的内容,这就是问题所在。当您遍历for循环时,尝试打印tokenized[tokenNum]的值(作为地址)。 -
这与:
int x=5; int y=x; x=3; int z=x有何不同。y和z不是都指向x吗?我不知道如何解决这个问题。找到令牌后是否应该初始化新的token? -
这就是变量和地址的区别:复制一个变量你得到那个变量的内容(即值);复制一个地址,你只会得到那个地址,而不是那个地址的内容。