2012-01-23 55 views
2

我正在使用特定的分隔符并行解析3个值。带连续分隔符的strtok_s行为

token1 = strtok_s(str1, separator, &nextToken1); 
token2 = strtok_s(str2, separator, &nextToken2); 
token3 = strtok_s(str3, separator, &nextToken3); 

while ((token1 != NULL) && (token2 != NULL) && (token3 != NULL)) 
{ 
    //... 
    token1 = strtok_s(NULL, separator, &nextToken1); 
    token2 = strtok_s(NULL, separator, &nextToken2); 
    token3 = strtok_s(NULL, separator, &nextToken3); 
} 

假设' - '是我的分隔符。该行为是不连续的分隔符的字符串:

1-2-3-45 

将有效地导致这些部分组成:

1 
2 
3 
45 

然而,随着连续两个分隔的字符串:

1-2--3-45 

将不会产生长度为0的字符串,则跳过该字符串,结果如下:

1 
2 
3 
45 

,而不是

1 
2 

3 
45 

什么办法或策略会更适合获得所有实际部分,包括0长度的呢?如果可能,我想避免重新实现strtok_s。

+0

strtok()是邪恶的,因为它修改了输入字符串。除此之外,我很好奇这个答案。 –

+0

在我的情况下,strtok可以修改字符串的所有想要的,我保持原来的和工作的副本。 – MPelletier

+0

我进入了微软的strtok_s.inl,看到这确实是预期的行为,因为有第一个“非分隔符”字符的前导分隔符跳过。嗯... – MPelletier

回答

6

不幸的是,strtok()忽略了空的标记。尽管你说你希望避免这样做,但除了自己解析它外,没有别的办法,例如使用strchr()来查找下一个分隔符,然后将该标记复制到临时变量进行处理。这样你可以根据你的需要处理空的代币。

1

是的,这是这个功能的工作方式。对于解析多个空白字符不应被视为空白字符的单词这样的任务更为合适。

我已经做了很多解析。我只会在这里编写我自己的解析器,代码一次检查一个字符。这并不难,你可以让它表现出你需要的。举例来说,我发布了一些C++代码来解析我的文章中的CSV文件Reading and Writing CSV Files in MFC