【发布时间】:2016-09-27 08:14:52
【问题描述】:
来自scanf的man页面:
指令是以下之一:
一系列空白字符(空格、制表符、换行符等;参见 isspace(3))。该指令匹配任何数量的 输入中的空格,包括无空格。
一个普通字符(即除空格或 '%' 以外的字符)。该字符必须与下一个字符完全匹配 输入。(强调我的)
以“%”(百分比)字符开头的转换规范。输入的字符序列是 根据这个规范转换,结果放在 对应的指针 争论。如果下一项输入与转换规范不匹配,则转换失败——这是一个匹配 失败。
现在,考虑以下代码:
#include <stdio.h>
int main(void)
{
const char* fmt = "A %49s B";
char buf[50];
printf("%d\n", sscanf("A foo B", fmt, buf)); // 1
printf("%d\n", sscanf("blah blaaah blah", fmt, buf)); // 0
printf("%d\n", sscanf("A blah blah", fmt, buf)); // 1
return 0;
}
第 1 行和第 3 行打印 1,因为匹配 "A" 和 "A" 成功,匹配 "foo"/"blah" 和 %s 也是如此。第 2 行打印 0,因为 "A" 无法与 "blah" 匹配,因此解析停止。
这一切都很好且合乎逻辑,但是我有什么方法可以检测到在所有转换规范都已成功匹配和分配后发生匹配失败?在这种情况下,scanf 返回的值将是我的格式字符串中的转换说明符的数量,所以直到最后我都无法判断匹配是否成功。
换句话说:第 3 行中提供给sscanf 的字符串不是“有效”的,因为它不是A [something] B 格式。我可以使用scanf 来检测这一点,还是strtok 是我唯一的选择?
【问题讨论】:
-
使用
sscanf对精确的字符串匹配并不可靠,使用正则表达式库来完成手头的任务会更强大。例如,pcre 库 或 GNU 的 regex 库。 -
你的问题是什么?完成后
sscanf返回。你还期待什么? -
@t0mm13b: 或者一个可能带有词法分析器的简单适当的解析器。没有足够的信息提供适当的建议。
-
@Olaf 解析器/词法分析器组合将用于更奇特的 DSL,在 OP 的用例中相当简化,使用解析器/词法分析的组合将是矫枉过正。
-
Regexp 也可能是。看我的回答。但我强烈认为 OP 不会解析“
blah blaaah blah”所以我的声明是:NEI。