我在一个while循环中使用Strtok将我的输入分成三个字符串,例如:
input="Command path 'you are beautiful'"
分为:
tok1="Command"
tok2="path"
tok3="'you are beautiful'"
我不能连续三次使用strtok因为tok3只是"'你"。
我的问题是,当我使用strtok时,初始变量输入会发生什么?
在strtok第一次打电话之后我想输入"路径'你是美丽的"",然后在第二个之后只是"'你很漂亮& #34;,因此我在运行strtok时逐渐减少了我的初始字符串
有可能吗?如果没有,我该怎么办?
答案 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经验,但还有其他选择。