sscanf() 是从一个字符串中读进与指定格式相符的数据.
scanf()是从终端输入读进与指定格式相符的数据
int sscanf(const char *str, const char format, …) - str:为C 字符串,是函数检索数据的源; - format:为C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。format 说明符形式为 [=%[][width][modifiers]type=]
- “*” :这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中;
- width:这指定了在当前读取操作中读取的最大字符数;
- modifiers :为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g);
- type:一个字符,指定了要被读取的数据类型以及数据读取方式;
这个函数接受一系列的指针作为附加参数,每一个指针都指向一个对象,对象类型由 format 字符串中相应的 % 标签指定,参数与 % 标签的顺序相同。
针对检索数据的 format 字符串中的每个 format 说明符,应指定一个附加参数。如果您想要把 sscanf 操作的结果存储在一个普通的变量中,您应该在标识符前放置引用运算符(&),例如:
int n;
sscanf (str,"%d",&n);
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
- 返回值是读取的参数个数;
- 取指定长度的字符串;
- 取到指定字符为止的字符串;
- 取到指定字符集为止的字符串;
- 取仅包含指定字符集的字符串;
- 获取指定字符中间的字符串;
- 指定要跳过的字符串;
- 分割以某字符隔开的字符串;
- 提取邮箱地址;
- 过滤掉不想截取或不需要的字符串;
string = "China beijing 123";
ret = sscanf(string, "%s %s %d", buf1, buf2, &digit);
printf("string = %sn", string);
printf("ret=%d, buf1=%s, buf2=%s, digit=%dn", ret, buf1, buf2, digit);
执行结果为:
string = China beijing 123 ret=3, buf1=china, buf2=beijing, digit=123
可以看出,sscanf的返回值是读取的参数个数。
string = "123456789";
sscanf(string, "%5s", buf1);
printf("string=%sn", string);
printf("buf1=%sn", buf1);
执行结果为:
string=123456789 buf1=12345
string = "123/456";
sscanf(string, "%[^/]", buf1);
printf("string=%sn", string);
printf("buf1=%sn", buf1);
执行结果为:
string=123/456 buf1=123
string = "123abcABC";
sscanf(string, "%[^A-Z]", buf1);
printf("string=%sn", string);
printf("buf1=%snn", buf1);
执行结果为:
string=123abcABC buf1=123abc
string = "0123abcABC";
sscanf(string, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3);
printf("string=%sn", string);
printf("buf1=%s, buf2=%s, buf3=%snn", buf1, buf2, buf3);
执行结果为:
string=0123abcABC buf1=0123, buf2=abc, buf3=ABC
string = "ioswp7";
sscanf(string, "%*[^<]<%[^>]", buf1);
printf("string=%sn", string);
printf("buf1=%snn", buf1);
执行结果为:
string=ios
wp7 buf1=android
string = "iosVSandroid";
sscanf(string, "%[a-z]VS%[a-z]", buf1, buf2);
printf("string=%sn", string);
printf("buf1=%s, buf2=%snn", buf1, buf2);
执行结果为:
string=iosVSandroid buf1=ios, buf2=android
string = "android-iphone-wp7";
/*字符串取道'-'为止,后面还需要跟着分隔符'-',起到过滤作用,有点类似于第7点*/
sscanf(string, "%[^-]-%[^-]-%[^-]", buf1, buf2, buf3);
printf("string=%sn", string);
printf("buf1=%s, buf2=%s, buf3=%snn", buf1, buf2, buf3);
执行结果为:
string=android-iphone-wp7 buf1=android, buf2=iphone, buf3=wp7
string = "Email:[email protected]";
sscanf(string, "%[^:]:%[^@]@%[^.].%s", buf1, buf2, buf3, buf4);
printf("string=%sn", string);
printf("buf1=%s, buf2=%s, buf3=%s, buf4=%snn", buf1, buf2, buf3, buf4);
执行结果为:
string=Email:[email protected] buf1=Email, buf2=beijing, buf3=sina, buf4=com.cn
string = "android iphone wp7";
sscanf(string, "%s %*s %s", buf1, buf2);
printf("string=%sn", string);
printf("buf1=%s, buf2=%snn", buf1, buf2);
string=android iphone wp7 buf1=android, buf2=
[1] http://www.runoob.com/cprogramming/c-function-sscanf.html
[2] http://www.cplusplus.com/reference/cstdio/sscanf/
[3] https://blog.csdn.net/pengnanzheng/article/details/81120890[4]https://www.dazhuanlan.com/2019/12/12/5df17c8562fcc/
使用示例
sscanf(sqlOutSmd, "\"%[^\"]\"", sql); // "......","......"提取第一个引号之间的字符串
sscanf(meta, "\"%*[^\"]\",\"%*[^=]=%[^\"]\"", ret); // "", "...=..."提取第二个引号之间=号之后的字符串