sscanf可以用来匹配通配符吗?

Can sscanf be used to match wildcards?

例如考虑一个 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 是匹配的通配符数字的数量。

格式 "%1d%1d33%1d" 应该是正确的,假设您输入的都是数字。但是您没有告诉我们什么 它失败的具体输入。您应该考虑字符串 "1 2334"" 1\n\n233 \t 4" 实际上会匹配,因为 %d 会吃掉空格直到找到整数。

请注意,如果您要使用 "%2d33%1d",情况会更糟,因为 2 个字符的整数可以是带负数的单个数字。

如果还不明显,使用 sscanf 进行此类匹配是不合适的。你最好使用正则表达式库,excel 在这种事情上。

但是,如果您只是想要一些快速有效的方法,那么到目前为止最简单的方法是将短路评估与 isdigit 一起使用。您甚至不需要检查字符串长度:

int matches( const char * s )
{
    return s
        && isdigit(s[0])
        && isdigit(s[1])
        && '3' ==  s[2]
        && '3' ==  s[3]
        && isdigit(s[4]);
}