【问题标题】:Strtok and its inputStrtok 及其输入
【发布时间】:2017-07-28 16:15:13
【问题描述】:

我在 while 循环中使用 Strtok 将我的输入拆分为三个字符串,例如:
input="Command path 'you are beautiful'" 拆分为:

tok1="Command"
tok2="path"
tok3="'you are beautiful'"

我不能连续使用 strtok 三次,因为 tok3 只是“你”。
我的问题是,当我使用 strtok 时,初始变量输入会发生什么情况?
在第一次调用 strtok 之后,我希望输入是“路径'你很漂亮'”,然后在第二个之后只是“'你很漂亮”,所以在我运行 strtok 时逐渐减少我的初始字符串。
有可能吗?如果没有,我该怎么办?

【问题讨论】:

  • 是的,strtok 正在更改输入字符串。如果您想保留原件,请将其复制到某处。
  • 是的,@EugeneSh.,但strtok() 不会以 OP 希望实现的方式修改原始字符串。
  • 点赞this
  • @iPhra,您似乎不欣赏strtok() 的操作模式。它不会创建输入的子字符串的副本,而是用字符串终止符覆盖原始字符串中的分隔符,并返回指向每个结果段的起始字符的指针。你可以通过一些工作来实现你所描述的,但除非你也复制你的令牌,否则它不会有你期望的结果。
  • strtok 是一个非常邪恶的功能。我想知道为什么它还没有被正式弃用。

标签: c string strtok


【解决方案1】:

Strtok 行为在标准(http://pubs.opengroup.org/onlinepubs/009695399/functions/strtok.html) 中定义如下:

对 strtok() 的一系列调用会破坏 s1 指向的字符串 成一系列标记,每个标记由一个字节分隔 s2 指向的字符串。序列中的第一个调用具有 s1 作为 它的第一个参数,然后是带有空指针的调用 他们的第一个论点。 s2 指向的分隔符字符串可能是 因调用而异。

序列中的第一个调用搜索 s1 指向的字符串 对于当前分隔符中不包含的第一个字节 s2 指向的字符串。如果没有找到这样的字节,那么就没有 s1 和 strtok() 指向的字符串中的标记应返回 null 指针。如果找到这样的字节,它就是第一个令牌的开始。

strtok() 函数然后从那里搜索一个字节 包含在当前分隔符字符串中。如果没有找到这样的字节, 当前标记延伸到 s1 指向的字符串的末尾, 并且随后对令牌的搜索将返回一个空指针。如果 找到这样一个字节,它被一个空字节覆盖,它 终止当前令牌。 strtok() 函数保存一个指向 下一个字节,下一次搜索令牌应从该字节 开始。

随后的每个调用,都以空指针作为第一个调用的值 参数,从保存的指针开始搜索并表现为 如上所述。

这意味着您可以只调用 strtok 两次,然后确定刚刚超过第二个子字符串的 \0 的位置以获得您想要的第三部分。

但是,这似乎不是一种合理的做法。它在处理错误(例如当第三个子字符串为空时)和潜在的未来扩展时都是不灵活的。此外,由于 strtok 接口的设计,使用它根本不是线程安全的。

最好手动编写一个小型词法分析器/解析器来满足您的需求,或者使用专门设计用于构建词法分析器(如果需要,还可以使用解析器)的工具。为此,我个人在使用 flex 方面有很好的经验,但还有其他选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多