【问题标题】:strtok_s behaviour with consecutive delimiters具有连续分隔符的 strtok_s 行为
【发布时间】:2012-01-24 04:19:11
【问题描述】:

我正在并行解析 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。

【问题讨论】:

  • strtok() 是邪恶的,因为它修改了输入字符串。除此之外,我很好奇这个问题的答案。
  • 就我而言,strtok 可以随心所欲地修改字符串,我保留原件并处理副本。
  • 我进入了微软的 strtok_s.inl 并看到这确实是预期的行为,因为第一个“非定界符”字符跳过了前导定界符。嗯……

标签: c strtok


【解决方案1】:

很遗憾,strtok() 会忽略空标记。即使您说您希望避免这样做,也别无他法,只能自己解析它,例如使用strchr() 查找下一个分隔符,然后将令牌复制到临时变量中进行处理。这样您就可以随心所欲地处理空令牌。

【讨论】:

    【解决方案2】:

    是的,这就是这个函数的工作方式。它更适合解析单词等不应将多个空白字符视为空单词的任务。

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

    中发布了一些用于解析 CSV 文件的 C++ 代码

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 2011-09-22
      相关资源
      最近更新 更多