sscanf可以用来匹配通配符吗?
问题描述:
例如考虑C字符串数组,所有的数字sscanf可以用来匹配通配符吗?
..."12334", "21335", "24335"...
,我想知道如何这些字符串的很多比赛这个通配符掩码
**33* (where * = any digit 0-9)
我可以用sscanf(str, mask, ...)
做到这一点?格式"%1d%1d%[3]%[3]%1d"
似乎比我想要的要多(当33不在那里时)和"%1d%1d33%1d"
似乎表现得很奇怪,匹配一些但不是全部匹配的条目。
上下文在我的代码:
if (sscanf(array[i], mask, &a1, &a2, &a3) == 3)
3被的通配符的数字位数匹配。
答
格式"%1d%1d33%1d"
应该是正确的,假设您的输入都是数字。但是你还没有告诉我们什么特定输入失败。您应该考虑字符串"1 2334"
和" 1\n\n233 \t 4"
实际上会匹配,因为%d
会吃掉空白直到找到一个整数。
请注意,如果你使用"%2d33%1d"
这会更糟,因为2个字符的整数可以是具有负单个数字。
如果它尚未可知,使用sscanf
对于这种类型的匹配的不合适。你最好使用正则表达式库,这在这种事情上很出色。
然而,迄今为止最简单的方法,如果你只是想要快速的作品,是与isdigit
一起使用短路计算。你甚至不需要检查字符串长度:
int matches(const char * s)
{
return s
&& isdigit(s[0])
&& isdigit(s[1])
&& '3' == s[2]
&& '3' == s[3]
&& isdigit(s[4]);
}
+2
还有一个额外的问题,如果要匹配的字符串或逗号或空格中有双引号,那么与整数相关的格式字符串将不会跳过引号;它会简单地将它们拒绝为不符合格式。我同意'sscanf()'不适合这项工作。 –
你能显示你的完整代码,包括检查返回值吗?使用'argv [1]'作为'sscanf()'的第一个参数的'int main()'的程序是完美的。 –
@John Zwinck我添加了用于检查的行。 'mask'是我描述的格式,'a1,a2,a3'是32位'int's。我真的只是问,如果'sscanf'能够完成我所描述的内容,以及格式应该是什么 –
@jefferson你有几个选择。 1)滥用strchr以确保字符串中的第一次和第二次出现在您想要的地方。 2)手工制作整数,以便可以匹配每种可能的组合。 – Chirality