拆分复杂字符串的C函数

时间:2021-05-05 21:59:46

标签: c string split

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

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

输出:

myroot
prod1
prod2 a b c 
prod3
ext ali

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

1 个答案:

答案 0 :(得分:4)

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

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