Strtok及其输入

时间:2017-07-28 16:15:14

标签: c string strtok

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

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

我不能连续三次使用strtok因为tok3只是"'你"。
我的问题是,当我使用strtok时,初始变量输入会发生什么? 在strtok第一次打电话之后我想输入"路径'你是美丽的"",然后在第二个之后只是"'你很漂亮& #34;,因此我在运行strtok时逐渐减少了我的初始字符串 有可能吗?如果没有,我该怎么办?

1 个答案:

答案 0 :(得分:0)

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经验,但还有其他选择。