具有连续分隔符的strtok_s行为

时间:2012-01-23 20:03:16

标签: c strtok

我正在解析3个并行的值,这些值用特定的分隔符分隔。

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。

2 个答案:

答案 0 :(得分:6)

不幸的是,strtok()会忽略空标记。即使你说你希望避免这样做,除了自己解析它之外别无他法,例如使用strchr()来查找下一个分隔符,然后将令牌复制到临时变量进行处理。这样你就可以随心所欲地处理空标记。

答案 1 :(得分:1)

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

我做了很多解析。我只想在这里编写自己的解析器,代码一次检查一个字符。这并不困难,你可以让它按照你的需要行事。例如,我在文章Reading and Writing CSV Files in MFC中发布了一些C ++代码来解析CSV文件