Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
做一些';strcmpf&x27;是否存在实施?_C_String_Formatting_String Comparison_C Libraries - Fatal编程技术网

做一些';strcmpf&x27;是否存在实施?

做一些';strcmpf&x27;是否存在实施?,c,string,formatting,string-comparison,c-libraries,C,String,Formatting,String Comparison,C Libraries,我正在寻找一个函数,该函数检查字符串是否遵循(精确匹配)与格式字符串对应的附加参数指定的数据模式 像这样: /* 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;

我正在寻找一个函数,该函数检查字符串是否遵循(精确匹配)与
格式
字符串对应的附加参数指定的数据模式 像这样:

/* 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;
我认为自己实现这一点将非常困难,但这样的函数对于内容的语义解析可能非常有用。在我尝试自己编写这样的函数之前,我需要知道是否已经有一个库或代码段提供了这样一个函数的实现


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

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

标准库没有这样的功能。对第三方库建议的请求在这里是离题的,但就我理解您想要的功能而言,我并不知道现有的第三方实现


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

实现这样一个函数非常简单,只需用于格式化,然后调用
strcmp
@JoachimPileborg就可以了,但是如果我必须将它放在一个函数中,调用
strcmp()
我仍然需要为函数提供可变参数。这对每个人来说都不是“很简单”,你不同意吗?至少对我来说并不实用。@KerrekSB没有,我只是说创建一个格式化字符串然后使用strcmp的函数很容易。如果调用不正确,则是另一个问题。:)@JoachimPileborg:我的理解是OP需要模式匹配,例如“hello”后面跟任何东西,后面跟“!”。这将不仅仅是固定字符串比较。也许我误解了OP或您提出的解决方案?我也不清楚的是,您想要模式匹配行为,而不是简单地格式化字符串并将格式化结果与目标字符串进行比较。如果您想要进行模式匹配,那么我建议您为该部分寻找一个正则表达式库(并为此设计合适的包装函数)解释的问题是,我依赖于人们理解为什么它是
strcmpf
而不是
sscanfcmp
。我需要这样一个函数的真正原因是正确解释gcc的stderr调试信息输出。那就是。。要知道消息的位置(例如,错误、警告、行链接、文件路径等等),我可以突出显示特定的信息。@Malina,为此,您可能甚至不需要正则表达式。GCC诊断由四个冒号(:)分隔的字段组成,您可以依靠前三个字段本身不包含冒号。您可以在(前三个)冒号处拆分诊断文本,并适当地处理每一部分。您可以使用
strtok()
,使用
sscanf()
,或以多种其他方式拆分字符串。例如,如果我有gcc消息“在函数“main”中,解释函数必须将其计算为“在%*s\”,以确保它是关于实例“main”的消息,而不是包含“在函数中”的错误消息。这就是为什么我需要这样的功能。这样我就可以最终检查编译器抛出什么样的消息。@Malina:regular expressions。正则表达式是一种比格式字符串更灵活、更具表现力的模式匹配机制。如果你还不知道任何正则表达式语言,那么现在是学习的好时机。Regex是我能想到的最适合这份工作的工具。