格式化输出API, printf, sprintf, vsprintf等等早已被大家知悉,使用规则也是了如指掌:比如 %d, %s, %p, %-02d等等;sscanf 相当使用的略少,它的用法除了常用的 %d, %s, %c等之后还有 “^”,“[”,“]”,“*”等等;
1. “^” 和正则表达式中的 ^作用一致, 相当于非;
2. “[”,“]”成对使用,和正则表达式中的 [, ]作用一样,相当于取值范围;
3. “*” 表示忽略,和正则表达式中的 * 取N个类似值的作用有区别;
函数原型:
int sscanf_s(
const char *buffer,
const char *format [,
argument ] ...
);
返回值表示匹配到的字段个数。
实例看看:
const char* src = "1234_abc_";
char szDst[32];
int iDst;
sscanf(src, "%d", &iDst); //<! 1)
sscanf(src, "%c", szDst); //<! 2)
sscanf(src, "%s", szDst); //<! 3)
sscanf(src, "%2s", szDst); //<! 4)
sscanf(src, "%[^_]", szDst); //<! 5)
sscanf(src, "%*[0-9_]%[^_]", szDst); //<! 6)
sscanf(src, "%d%s", &iDst, szDst); //<! 7)
sscanf(src, "%d_%s", &iDst, szDst); //<! 8)
第一个例子: 格式化整形,遇到非数字范围的ascii码时停止匹配, iDst=1234;
第二个例子:格式化字节,只格式化一个字节,szDst=1,后面31个字节是初始化数组时默认值;
第三个例子:格式化字符串,szDst=1234_abc_ 并且以'\0'结尾;
第四个例子:格式化定长字符串,szDst=12,因为指定了长度最长格式化2个, %2s;
第五个例子:格式化字符串匹配,遇到“_”时停止匹配, szDst=1234
第六个例子:格式化字符串且忽略匹配,忽略0到9和_字符, 并且遇到_时停止匹配,szDst=abc
以上的例子都是同时只匹配一项;如果要匹配多项呢? 可以说是简单加和
第七个例子,同时格式化整形和字符串, iDst=1234, szDst=_abc_
第八个例子,同时格式化整形,跳跃格式化字符串, iDst=1234, szDst=abc,中间的_被跳跃了。
除了此函数外,还有相应的变体 sscanf_l, w版本等等。