强大的sscanf函数
来源:互联网 发布:matlab数据预处理 编辑:程序博客网 时间:2024/05/01 00:28
函数原型
int sscanf( const char *buffer, const char *format, [ argument ] … );
参数说明
buffer
存储的数据
format
格式控制字符串。
argument
可选自变量
头文件
sscanf
说明
sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
第二个参数可以是一个或多个 {%[*] [width] [{h | I | I64 | L}]type | ’ ’ | ‘\t’ | ‘\n’ | 非%符号}
注:
- * 亦可用于格式中, (即 %d 和 %*s) 加了星号 () 表示跳过此数据不读入,(也就是不把此数据读入参数中);
- {a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d;
- width表示读取宽度;
- {h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size;
- type :这就很多了,就是%s,%d之类;
- 特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。
返回值
每个函数都将返回成功转换并分配的字段数;返回值不包括已读取但未分配的字段。 返回值为 0 表示没有分配任何字段。 返回值是EOF是否有错误或如果在第一次转换之前到达字符串结尾。如果buffer或format是NULL调用指针,无效参数处理程序,如中所述参数验证。 如果允许继续执行,则这些函数返回 -1 并将errno设置为EINVAL。成功则返回参数数目,失败则返回-1,错误原因存于errno中。经多次测试,在linux系统中成功返回的是成功转换的值的个数,例如:
- sscanf(“1 2 3”,”%d %d %d”,buf1, buf2, buf3); 成功调用返回值为3,即buf1,buf2,buf3均成功转换。
- sscanf(“1 2”,”%d %d %d”,buf1, buf2, buf3); 成功调用返回值为2,即只有buf1,buf2成功转换。
(注意:此处buf*均为地址)
作用
读取格式化的字符串中的数据。
使用实例:
- 一般用法
char buf[512] = ;sscanf("123456 ", "%s", buf);printf("%s\n", buf);
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);printf("%s\n", buf);
结果为:1234
- 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);printf("%s\n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);printf("%s\n", buf);
结果为:123456abcdedf
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);printf("%s\n", buf);
结果为:123456abcdedf
6. 给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 “iios/”过滤掉,再将非’@’的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);printf("%s\n", buf);
结果为:12DDWDFF
7. 给定一个字符串”hello, world”,仅保留”world”。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf);printf("%s\n", buf);
结果为:world
P.S. %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,如果没有空格则结果为NULL。
8. 最后给一个转换点分十进制ip的实例
#include <stdio.h>void main(){ unsigned char buf[5]; char ipaddr[32]="192.168.1.2/22"; sscanf(ipaddr,"%d.%d.%d.%d/%d",buf,buf+1,buf+2,buf+3,buf+4); printf("%d.%d.%d.%d/%d\n",buf[0],buf[1],buf[2],buf[3],buf[4]);}
注意后面的buf,buf+1…都是地址,千万不能写成buf[0],buf[1]…这样sscanf取出来的数存在地址为buf[0]的空间里,会产生段错误的。
- 强大的sscanf 函数
- 强大的sscanf函数
- 强大的sscanf函数
- sscanf函数的用法,功能很强大
- 再次体验 sscanf函数的强大
- sscanf的强大功能
- sscanf意想不到的强大
- 强大的sscanf正则表达式
- iOS之强大的sscanf
- 原来sscanf函数可以这么强大
- 字符串处理函数sscanf的使用(某些程度上替代正则表达式,很强大)
- sscanf和sprintf的强大用法--自用
- sscanf函数的用法
- sscanf函数的用法
- sscanf 函数的用法
- sscanf 函数的用法
- sscanf函数的用法
- sscanf函数的用法
- 向eclipse中导入一个项目时,JSP页面全部报错
- TableView常用设置和遇到的问题
- ppt powerpoint 2000 2003 2007 2010 2013 2016插入视频的方法
- tensorflow模型的定点化
- django guardian 对象级别权限设计
- 强大的sscanf函数
- java compareTo()方法返回值
- c++笔试题2
- 【PSI/SI学习系列】1.从TS流到PAT和PMT——神文001
- Java创建对象过程中,内存的分配
- 仿微信图片压缩Luban的使用
- scikit-learn
- cordova 真机使用远程H5页面调试
- 常见日志、抓包和系统监控分析软件