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

时间:2016-11-24 03:53:27

标签: c scanf c-strings stdio

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

1 个答案:

答案 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]);
}