2016-11-24 78 views
3

例如考虑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被的通配符的数字位数匹配。

+0

你能显示你的完整代码,包括检查返回值吗?使用'argv [1]'作为'sscanf()'的第一个参数的'int main()'的程序是完美的。 –

+0

@John Zwinck我添加了用于检查的行。 'mask'是我描述的格式,'a1,a2,a3'是32位'int's。我真的只是问,如果'sscanf'能够完成我所描述的内容,以及格式应该是什么 –

+0

@jefferson你有几个选择。 1)滥用strchr以确保字符串中的第一次和第二次出现在您想要的地方。 2)手工制作整数,以便可以匹配每种可能的组合。 – Chirality

回答

4

格式"%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()'不适合这项工作。 –