【问题标题】:Does some kind of 'strcmpf' implementation exists?是否存在某种“strcmpf”实现?
【发布时间】:2016-12-11 21:09:07
【问题描述】:

我正在寻找一个函数来检查字符串是否遵循(完全匹配)由对应于format 字符串的附加参数指定的数据模式 像这样:

/* int strcmpf (char *str1, char *format, ...); */
char *test = "Hello World !"

if(!strcmpf(test, "%s%*s %c", "Hello ", '!')
    return HELLO_HAS_BEEN_SAID;
else
    return PROGRAM_ISNT_POLITE;

我认为自己实现这个功能会非常困难,但这样的功能对于内容的语义解析可能非常有用。在我尝试自己编写这样的函数之前,我需要知道是否已经有一个库或代码 sn-p 提供了这样的函数的实现?


更具体地说,我需要模式匹配行为。所以test必须与format参数对应的数据所指定的模式完全匹配。

【问题讨论】:

  • 实现这样的功能很简单,只需使用vsnprintf进行格式化,然后调用strcmp即可。
  • @JoachimPileborg 非常正确,但是如果我必须将它放在一个函数中,同时调用strcmp(),我仍然需要为函数提供可变参数。对于每个人来说,哪个不是“非常简单”的,你不同意吗?至少对我来说似乎不太实用..
  • @KerrekSB 不是,我只是说创建一个格式化字符串然后使用strcmp 的函数很容易。如果没有正确调用它是另一个问题。 :)
  • @JoachimPileborg:我的理解是 OP 想要模式匹配,例如“你好”后跟任何内容,然后是“!”。这不仅仅是固定字符串比较。也许我误解了 OP 或您提出的解决方案?
  • 对我来说也不清楚的是,您需要模式匹配行为,而不是简单地格式化字符串并将格式化结果与目标字符串进行比较。如果您希望引入模式匹配,那么我建议您查看该部分的正则表达式库(并为此适当设计您的包装函数)。

标签: c string formatting string-comparison c-libraries


【解决方案1】:

我需要知道是否已经有一个库或代码 sn-p 提供了这样的函数的实现

标准库没有这样的功能。第三方库建议的请求在这里是题外话,但就我了解您想要的功能而言,无论如何我都不知道现有的第三方实现。

正如我在 cmets 中所说,我建议您围绕 真正 正则表达式设计模式匹配方面,而不是围绕 printf()scanf() 格式(它们并不完全相同) .有几个正则表达式库可用于支持该部分。

【讨论】:

  • 解释的问题来自于我依靠人们理解为什么它是strcmpf而不是sscanfcmp我猜。
  • 我需要这样一个函数的真正原因是为了正确解释 gcc 的 stderr 调试信息输出。也就是说..要知道消息在哪里实例、错误、警告、行链接、文件路径等:) 这样我就可以突出显示具体信息。
  • @Malina,为此,您可能甚至不需要正则表达式。 GCC 诊断由四个以冒号 (:) 分隔的字段组成,您可以依靠前三个字段本身不包含冒号。您可以在(前三个)冒号处拆分诊断文本并适当地处理每个部分。您可以使用strtok()sscanf() 或其他多种方式拆分字符串。
  • 例如,如果我有 gcc 消息“In function 'main'”,解释函数必须将其评估为“In %*s \'”,以确保它是关于实例 'main' 的消息' 不是例如包含“功能中”的错误消息。这就是为什么我需要这样的功能。这样我就可以最终检查编译器会抛出什么样的消息。
  • @Malina:正则表达式。正则表达式是一种比格式字符串更灵活和更具表现力的模式匹配机制。如果您还不知道任何正则表达式语言,那么现在是学习的好时机。正则表达式是我能想到的最适合这项工作的工具。
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
相关资源
最近更新 更多