sscanf的用法

sscanf的用法

一、有关描述[1]

sscanf() 是从一个字符串中读进与指定格式相符的数据.

scanf()是从终端输入读进与指定格式相符的数据

1.sscanf()格式:

int sscanf(const char *str, const char format, …) - str:为C 字符串,是函数检索数据的源; - format:为C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。format 说明符形式为 [=%[][width][modifiers]type=]

2.format详解
  • “*” :这是一个可选的星号,表示数据是从流 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:一个字符,指定了要被读取的数据类型以及数据读取方式;
3.附加参数

​ 这个函数接受一系列的指针作为附加参数,每一个指针都指向一个对象,对象类型由 format 字符串中相应的 % 标签指定,参数与 % 标签的顺序相同。
​ 针对检索数据的 format 字符串中的每个 format 说明符,应指定一个附加参数。如果您想要把 sscanf 操作的结果存储在一个普通的变量中,您应该在标识符前放置引用运算符(&),例如:

int n;
sscanf (str,"%d",&n);
4.函数的返回值[2]

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

二、sscanf() 主要功能

  1. 返回值是读取的参数个数;
  2. 取指定长度的字符串;
  3. 取到指定字符为止的字符串;
  4. 取到指定字符集为止的字符串;
  5. 取仅包含指定字符集的字符串;
  6. 获取指定字符中间的字符串;
  7. 指定要跳过的字符串;
  8. 分割以某字符隔开的字符串;
  9. 提取邮箱地址;
  10. 过滤掉不想截取或不需要的字符串;

三、sscanf()实例[3]

1.最简单的用法
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的返回值是读取的参数个数

2.取指定长度的字符串
string = "123456789";
sscanf(string, "%5s", buf1);
printf("string=%sn", string);
printf("buf1=%sn", buf1);

执行结果为:

string=123456789 buf1=12345
3.取到指定字符为止的字符串
string = "123/456";
sscanf(string, "%[^/]", buf1);
printf("string=%sn", string);
printf("buf1=%sn", buf1);

执行结果为:

string=123/456 buf1=123
4.取到指定字符集为止的字符串
string = "123abcABC";
sscanf(string, "%[^A-Z]", buf1);
printf("string=%sn", string);
printf("buf1=%snn", buf1);

执行结果为:

string=123abcABC buf1=123abc
5.取仅包含指定字符集的字符串
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
6.获取指定字符中间的字符串
string = "ioswp7";
sscanf(string, "%*[^<]<%[^>]", buf1);
printf("string=%sn", string);
printf("buf1=%snn", buf1);

执行结果为:

string=ioswp7 buf1=android
7.指定要跳过的字符串
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
8.分割以某字符隔开的字符串
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
9.提取邮箱地址
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
10.过滤掉不想截取或不需要的字符串
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);   // "", "...=..."提取第二个引号之间=号之后的字符串

你可能感兴趣的:(linux,程序学习,c,linux)