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]);
}
例如考虑一个 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]);
}