例如,考虑一个C字符串数组,所有数字
..."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 :(得分: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]);
}