我使用了一个while循环中的Strtok来将我的输入拆分为三个字符串,例如:
要拆分到的input="Command path 'you are beautiful'":
tok1="Command"
tok2="path"
tok3="'you are beautiful'"
我不能连续使用strtok三次,因为tok3就是“你”。
我的问题是,当我使用strtok时,初始变量输入会发生什么?
在第一次调用strtok之后,我希望输入为"path 'you are beautiful'",然后在第二次调用之后输入"'you are beautiful‘“,因此在运行strtok时逐步减少我的初始字符串。
有可能吗?如果没有,我该怎么做呢?
发布于 2017-07-29 02:01:36
Strtok行为在标准(http://pubs.opengroup.org/onlinepubs/009695399/functions/strtok.html)中定义如下:
strtok调用
()的序列将s1指向的字符串分解成一系列标记,每个标记由s2指向的字符串中的一个字节分隔。序列中的第一个调用将s1作为其第一个参数,然后是使用空指针作为其第一个参数的调用。s2指向的分隔符字符串可能因调用而异。
序列中的第一个调用在s2指向的当前分隔符字符串中未包含的第一个字节中搜索s1指向的字符串。如果没有找到这样的字节,那么s1所指向的字符串中就没有标记,并且strtok()将返回一个空指针。如果找到这样的字节,它就是第一个令牌的开始。
然后,strtok()函数从那里搜索包含在当前分隔符字符串中的字节。如果没有找到这样的字节,则当前标记将扩展到s1所指向的字符串的末尾,并且后续对标记的搜索将返回一个空指针。如果找到这样的字节,它将被空字节覆盖,从而终止当前令牌。strtok()函数保存一个指向下一个字节的指针,下一次搜索令牌将从该字节开始。
每个后续调用都以空指针作为第一个参数的值,从保存的指针开始搜索,并如上所述地工作。
这意味着您只需调用strtok两次,然后确定位置刚好超过第二个子字符串的\0,即可获得所需的第三部分。
然而,这似乎不是一种合理的方法。它在处理错误(比如第三个子字符串为空时)和潜在的未来扩展方面都是不灵活的。此外,由于strtok接口的设计,使用它根本不是线程安全的。
更好的办法可能是手工编写一个小型的词法分析器/解析器来完成您想要的操作,或者使用专门为构建词法分析器而设计的工具(如果需要,也可以使用解析器)。出于这个目的,我个人对flex有很好的体验,但还有其他选择。
https://stackoverflow.com/questions/45378130
复制相似问题