【问题标题】:C function to split complex strings拆分复杂字符串的C函数
【发布时间】:2021-07-28 05:53:39
【问题描述】:

大家好,我需要拆分一个字符串,例如,

["myroot", "prod1" , ["prod2", "a",  "b","c"], "prod3", ["ext", "ali"] ]

输出:

myroot
prod1
prod2 a b c 
prod3
ext ali

我是 C 编程语言的新手,但我需要弄清楚这个任务。我找不到这样做的好方法。我可以使用任何数据结构算法或方法来做到这一点吗?任何帮助将不胜感激。我不希望你分享代码,如果你能给我一些关于我可以使用的 c 函数和算法的想法,我将不胜感激。

【问题讨论】:

  • 你以前写过分词器吗?听起来今天就是这一天。
  • @tadman 感谢您的建议,但如果使用带有 ',' 的 strtok,我还需要将大括号内的字符串作为一个整体进行拆分,我实际上不会解决我的问题。
  • 这看起来像 JSON,使用 JSON 解析库。
  • 不要使用 strtok - 它不会告诉你它找到了哪个分隔符。编写您自己的解析器来分析每个字符并跟踪解析状态。或者只使用 flex 和 bison。
  • strtok() 只是一个工具。 “标记器”可能比这复杂得多,并且需要解析这种类似 JSON 的数据。

标签: c string split


【解决方案1】:

最简单的解析器使用一些全局状态来保持您的位置,并按字符读取输入字符并执行更改每个字符状态的操作。沿着:

  • 保持状态:
    • bool:你在双引号内吗?
    • bool:你在 [ ] 块内吗?
    • bool:你在嵌套的 [ ] 块内吗?
    • 用于输出的字符串数组
  • 按char读取字符串char
  • switch 在每种情况下的每个字符和高级状态
    • 你读过[?这意味着您在 [ ] 块内。
    • 您阅读了[ 并且您已经在 [ ] 块内?这是一个嵌套的 [ ] 块。
    • 您阅读了] 并且您在嵌套的 [ ] 块内?你不再是了。
    • 您阅读了",但您不在引号内?你现在是。
    • 您阅读了" 并且您在引号内?报价结束。
    • 你读过,?这是一个分隔符。如果您不在嵌套的 [ ] 块内,则将输出写入下一个数组元素。在嵌套的 [ ] 块内时,您不会推进输出数组元素,如输出所示,而是在当前输出数组元素中添加一个空格。
    • 你读过空格吗?这是一个分隔符 - 忽略它。注意 - 不要在引用中忽略它。
    • 你还读过什么吗?如果它在引号内,则转到输出 - 输出数组中的当前数组元素,需要 reallocated 并附加。
    • 您阅读了其他内容,但您不在报价范围内?这是一个错误。
    • 等。处理所有情况和所有可能的状态。

【讨论】:

  • 这对于某人的第一个状态机来说已经很多了,但它是一个很好的清单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2015-11-20
相关资源
最近更新 更多