首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Strtok及其输入

Strtok及其输入
EN

Stack Overflow用户
提问于 2017-07-29 00:15:14
回答 1查看 166关注 0票数 0

我使用了一个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时逐步减少我的初始字符串。

有可能吗?如果没有,我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 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有很好的体验,但还有其他选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45378130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档