繁体   English   中英

C-澄清strtok中的分隔符

[英]C - clarifying delimiters in strtok

我正在尝试分解一个同时包含管道(|)和OR符号(||)的shell命令,这些命令用strtok数组中的字符表示,但是OR命令也可能是彼此相邻的两个管道。 具体来说,我需要知道何时|,;,&&或||。 显示在命令中。

有没有一种方法可以指定一个定界符在哪里结束,另一个定界符在strtok中开始,因为我知道通常这些定界符是一个字符长,并且您只列出了所有定界符,中间没有空格或任何空格。

哦,换行符是有效的分隔符吗? 还是strtok只做空格?

从最后一个问题开始:是的, strtok可以使用换行符作为分隔符,而不会出现任何问题。

不幸的是,第一个问题的答案并不十分肯定。 strtok将所有定界符视为相同,并且不区分单个定界符和任意数量的连续定界符。 换句话说,如果您给|&; 作为定界符,它将||||||||| &&&&|&|; 完全一样。

我会走得更远:我会四肢strtok地陈述一个事实,即strtok根本不适合将shell命令分解为组成部分-我很确定没有办法使用它这项工作将产生可用的结果。

特别是,你没有什么, 只是作为一个分隔符。 为了您的目的, &| || 是他们自己的令牌。 在提供给shell的字符串中,您不一定有任何东西可以用strtok “思考”它们的方式来作为定界符。

strtok面向由分隔符分隔的标记,分隔符除了分隔符外什么没有 strtok读取令牌时,它们之间的定界符将被完全忽略(并且为此已被销毁)。 对于外壳,像a|b这样的字符串实际上是三个标记-您需要a| bstrtok之间没有任何东西可以安全地覆盖和/或忽略-但这是strtok如何工作的要求。 为了为您提供第a字符,它会用'\\0'覆盖下一个字符(在本例中为| )。 然后,它无法恢复该管道以告诉您下一个令牌应该是什么。

我认为您可能需要一个贪婪的令牌生成器-即,它构建可以作为令牌的最长字符串,并在遇到不能作为当前令牌一部分的字符时停止。 当您要求下一个标记时,它从上一个标记结束后的第一个字符开始,而无需(不必要)跳过/忽略任何内容(当然,如果遇到类似空白的东西,但没有被引用)以某种方式,它可能会跳过它)。

strtok()是一个基本的通用解析函数。 对于更高级的解析,我不建议使用它。

例如,对于“ |”,您确实需要检查下一个字符以确定是否找到了“ |”。 或“ ||”。

我已经完成了这种性质的大量分析,包括编写了一个小型语言解释器。 如果将其分解为较小的任务,这并不难。 但是我的建议是在这种情况下编写自己的解析例程。

而且,是的,换行符是有效的分隔符。

就您的目的而言, strtok()不是正确的工具。 它破坏了定界符,因此如果有人键入ls|wc ,您将无法知道令牌末尾的内容。 可能是管道,分号,&符或空格。 而且,它将多个相邻的定界符视为单个定界符的一部分。

看一下strspn()strcspn() 两者都在标准C中,并且是strtok()非破坏性亲戚。

strtok()很高兴使用换行符作为分隔符; 实际上,除'\\0'以外'\\0'任何字符都可用作分隔符之一。

还有其他一些对使用strtok()极为谨慎的原因,例如线程安全性以及在库代码中使用它非常不明智的事实。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM