sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。可用与复杂字符串解析提取,比如cjson字符串解析。
第二个参数可以是一个或多个 {%[*] [width] [{h | I | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
注:
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
失败返回0 ,否则返回格式化的参数个数
7、如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
1、一般用法
1 2 3 |
|
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
1 2 |
|
结果为:[1234]
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
1 2 |
|
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
1 2 |
|
结果为:123456abcdedf
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
1 2 |
|
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
1 2 |
|
结果为:12DDWDFF
7、给定一个字符串"hello, world",仅保留"world"。(注意:“,”之后有一空格)
1 2 |
|
结果为:world P.S. %*s表示第一个匹配到的%s被过滤掉,即hello,被过滤了,如果没有空格则结果为NULL。
8、其他正则表达式
从这个实验开始我们会使用正则表达式,括号里面的a-z就是一个正则表达式,它可以表示从a到z的任意字符
补充:
%[ ] 的用法:%[ ]表示要读入一个字符集合, 如果[ 后面第一个字符是”^”,则表示反意思。
[ ]内的字符串可以是1或更多字符组成。空字符集(%[])是违反规定的,可
导致不可预知的结果。%[^]也是违反规定的。
%[a-z] 读取在 a-z 之间的字符串,如果不在此之前则停止,如
char s[]=”hello, my friend” ; // 注意: ,逗号在不 a-z之间
sscanf( s, “%[a-z]”, string ) ; // string=hello
%[^a-z] 读取不在 a-z 之间的字符串,如果碰到a-z之间的字符则停止,如
char s[]=”HELLOkitty” ; // 注意: ,逗号在不 a-z之间
sscanf( s, “%[^a-z]”, string ) ; // string=HELLO
%*[^=] 前面带 * 号表示不保存变量。跳过符合条件的字符串。
char s[]=”notepad=1.0.0.1001″ ;
char szfilename [32] = “” ;
int i = sscanf( s, “%*[^=]”, szfilename ) ; // szfilename=NULL,因为没保存
int i = sscanf( s, “%*[^=]=%s”, szfilename ) ; // szfilename=1.0.0.1001
%[^=] 读取字符串直到碰到’=’号,’^’后面可以带更多字符
4)字符串提取数字:
int a, b, c;
sscanf(“2006:03:18”, “%d:%d:%d”, &a, &b, &c); //a = 2006 b = 3 c = 18
5、
char *str = "type subtitle:789";
int number;
sscanf(str, "subtitle: %lf", &number);
printf("number:%f\n",number);