【问题标题】:sscanf function in CC中的sscanf函数
【发布时间】:2021-05-10 20:33:28
【问题描述】:

我正在使用我的 C 程序,我对如何使用 sscanf 函数有疑问。

我必须从像something$HOME/something2 这样的字符串中获取三个字符串:第一个必须包含“something”,第二个必须包含“HOME”,第三个必须包含“/something2”。 但它还必须能够拆分$HOME$HOME/something,或something$HOME...

我写的是这样的:

sscanf(str,"%m[^$]$%m[_a-zA-Z0-9]%*m", &ant, &act, &sig);

但是对于$HOME$HOME/somethingsomething$HOME... 的情况,它需要非常奇怪的字符串。如果它们不存在,我可以在我的 sscanf 上放置什么以通过 NULL 获取其他值?

【问题讨论】:

  • sscanf 格式字符串不是正则表达式。如果您需要正则表达式功能,则需要使用专用库。
  • 格式字符串末尾的 "…%*m" 被破坏;在m 之后需要s[…](扫描集)。您没有测试来自sscanf() 的返回值;它会告诉你出了点问题,可能是通过返回 EOF,也可能是在你需要返回 3 时只返回 2。
  • 请注意,sscanf() 转换规范均不接受空字符串,因此您无法通过一次调用 sscanf() 来处理“可能丢失的部分”。使用sscanf() 的优点之一是您可以在相同的数据上尝试不同的格式字符串,直到找到可以根据需要解析数据的格式字符串。

标签: c scanf


【解决方案1】:

抱歉,您应该为此使用sscanf。您的输入似乎是一个 shell 命令行参数,您似乎想要实现变量扩展。

为此,您必须编写您自己的解析器来解析表达式、识别并进行变量扩展。这不是 scanf 的工作 - 这是您的自定义循环的工作,您可以在其中检查字符串中的每个字符。

有一个实用程序与 正是 类似的功能称为 envsubst。你可以检查its source gettext/envsubst.c。你也可以看看wordexp;但是,wordexp 函数是一种更广泛的函数。

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2014-12-22
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多