C语言中 sscanf 的用法
名称:
sscanf() - 从一个字符串中读进与指定格式相符的数据.
函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... );
说明:
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个 {%[*] [width] [{h | l | 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 表示满足该条件的被过滤掉,不会向目标参数中写入值
支持集合操作:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
下面是一段实例程序
/***************************************************** ** Name : sscanf.c ** Author : gzshun ** Version : 1.0 ** Date : 2011-12 ** Description : sscanf function ******************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> static void sscanf_test(void); static void sscanf_test(void) { int ret; char *string; int digit; char buf1[255]; char buf2[255]; char buf3[255]; char buf4[255]; /*1.最简单的用法*/ string = "china beijing 123"; ret = sscanf(string, "%s %s %d", buf1, buf2, &digit); printf("1.string=%s\n", string); printf("1.ret=%d, buf1=%s, buf2=%s, digit=%d\n\n", ret, buf1, buf2, digit); /* **执行结果: **1.ret=3, buf1=china, buf2=beijing, digit=123 **可以看出,sscanf的返回值是读取的参数个数 */ /*2.取指定长度的字符串*/ string = "123456789"; sscanf(string, "%5s", buf1); printf("2.string=%s\n", string); printf("2.buf1=%s\n\n", buf1); /* **执行结果: **2.buf1=12345 */ /*3.取到指定字符为止的字符串*/ string = "123/456"; sscanf(string, "%[^/]", buf1); printf("3.string=%s\n", string); printf("3.buf1=%s\n\n", buf1); /* **执行结果: **3.buf1=123 */ /*4.取到指定字符集为止的字符串*/ string = "123abcABC"; sscanf(string, "%[^A-Z]", buf1); printf("4.string=%s\n", string); printf("4.buf1=%s\n\n", buf1); /* **执行结果: **4.buf1=123abc */ /*5.取仅包含指定字符集的字符串*/ string = "0123abcABC"; sscanf(string, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3); printf("5.string=%s\n", string); printf("5.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3); /* **执行结果: **5.buf1=123, buf2=abc, buf3=ABC */ /*6.获取指定字符中间的字符串*/ string = "ios<android>wp7"; sscanf(string, "%*[^<]<%[^>]", buf1); printf("6.string=%s\n", string); printf("6.buf1=%s\n\n", buf1); /* **执行结果: **6.buf1=android */ /*7.指定要跳过的字符串*/ string = "iosVSandroid"; sscanf(string, "%[a-z]VS%[a-z]", buf1, buf2); printf("7.string=%s\n", string); printf("7.buf1=%s, buf2=%s\n\n", buf1, buf2); /* **执行结果: **7.buf1=ios, buf2=android */ /*8.分割以某字符隔开的字符串*/ string = "android-iphone-wp7"; /* **字符串取道'-'为止,后面还需要跟着分隔符'-', **起到过滤作用,有点类似于第7点 */ sscanf(string, "%[^-]-%[^-]-%[^-]", buf1, buf2, buf3); printf("8.string=%s\n", string); printf("8.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3); /* **执行结果: **8.buf1=android, buf2=iphone, buf3=wp7 */ /*9.提取邮箱地址*/ string = "Email:beijing@sina.com.cn"; sscanf(string, "%[^:]:%[^@]@%[^.].%s", buf1, buf2, buf3, buf4); printf("9.string=%s\n", string); printf("9.buf1=%s, buf2=%s, buf3=%s, buf4=%s\n\n", buf1, buf2, buf3, buf4); /* **执行结果: **9.buf1=Email, buf2=beijing, buf3=sina, buf4=com.cn */ /*10.过滤掉不想截取或不需要的字符串--补充, **在%号后面加一*号,代表过滤这个字符串,不读取 */ string = "android iphone wp7"; sscanf(string, "%s %*s %s", buf1, buf2); printf("10.string=%s\n", string); printf("10.buf1=%s, buf2=%s\n\n", buf1, buf2); /* **执行结果: **10.android wp7 */ } int main(int argc, char **argv) { sscanf_test(); return 0; } /* **测试程序 **环境: **Linux ubuntu 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux **gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ** gzshun@ubuntu:~/c/sscanf$ gcc sscanf.c -o sscanf gzshun@ubuntu:~/c/sscanf$ ./sscanf 1.string=china beijing 123 1.ret=3, buf1=china, buf2=beijing, digit=123 2.string=123456789 2.buf1=12345 3.string=123/456 3.buf1=123 4.string=123abcABC 4.buf1=123abc 5.string=0123abcABC 5.buf1=0123, buf2=abc, buf3=ABC 6.string=ios<android>wp7 6.buf1=android 7.string=iosVSandroid 7.buf1=ios, buf2=android 8.string=android-iphone-wp7 8.buf1=android, buf2=iphone, buf3=wp7 9.string=Email:beijing@sina.com.cn 9.buf1=Email, buf2=beijing, buf3=sina, buf4=com.cn 10.string=android iphone wp7 10.buf1=android, buf2=wp7 */
C语言中 sscanf 的用法的更多相关文章
- C语言中qsort函数用法
C语言中qsort函数用法-示例分析 本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...
- C语言中sizeof()的用法
语法 sizeof有三种语法形式: 1.sizeof(object); //sizeof(对象); 2.sizeof(type_name); //sizeof(类型); 3.sizeof object ...
- C/C++语言中const的用法
1. const 在C和C++中的区别 C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...
- 在不同语言中static的用法
static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...
- C语言中 malloc函数用法
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...
- 浅析C语言中assert的用法(转)
原文地址:http://www.jb51.net/article/39685.htm 以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下. assert宏的原型定义在<ass ...
- C语言中extern的用法--转
http://blog.sina.com.cn/s/blog_52deb9d50100ml6y.html 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的, ...
- C语言中#define的用法(转)
转自:http://www.dingge.com/main/article.asp?id=10 今天整理了一些#define的用法,与大家共享! 1.简单的define定义 #define MAXTI ...
- C语言中#define的用法
今天整理了一些#define的用法,与大家共享! 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i& ...
随机推荐
- MacOS下Rails+Nginx+SSL环境的搭建(上)
这里把主要的步骤写下来,反正我是走了不少弯路,希望由此需求的朋友们别再走类似的弯路.虽说环境是在MacOS下搭建,但是基本上和linux下的很相像,大家可以举一反三. 一.安装Rails 这个是最简单 ...
- 使用GDAL进行RPC坐标转换
使用GDAL进行RPC坐标转换 对于高分辨率遥感卫星数据而言,目前几乎都提供了有理函数模型(RFM)来进行图像校正(SPOT系列提供了有理函数模型之外还提供了严格轨道模型).对遥感影像进行校正目前最常 ...
- getParameter的用法总结
getParameter得到的都是String类型的.或者是用于读取提交的表单中的值(http://a.jsp?id=123中的123),或者是某个表单提交过去的数据: getAttribute则可以 ...
- RDO Stack:VMs cannot access external network.
Issue: There are many root causes to make your openstack vm instances cannot be reached from externa ...
- An internal error occurred during: "Retrieving archetypes:". GC overhead limit exceeded
An internal error occurred during: "Retrieving archetypes:".GC overhead limit exceeded 异常, ...
- 剑指Offer——关于劳动合同,这6件事毕业生必须知道!
剑指Offer--关于劳动合同,这6件事毕业生必须知道! 求职找工作,不少人拿到劳动合同的那刻,可能连合同内容都没看清,就挥着笔杆子"签签签".别急!劳动合同包含哪些条款你清楚 ...
- Windows Python requests 详细模块安装方法
据说requests是一个很吊的处理网络问题的第三方库.我折腾了半天.终于在Win上安装好了. 网上找到的都不详细,我是反复尝试才成功的. 还是自己写一个傻瓜式的指南吧: 1.安装 Setuptool ...
- 获取客户信息SQL
/*取客户信息SQL*/ --客户信息 SELECT hou.name 业务实体, hca.account_number 客户编号, hp.party_name 客户名称, arp_addr_pkg. ...
- SpriteKit给游戏弹跳角色添加一个高度标示器
这是一个类似于跳跃涂鸦的小游戏,主角不断吃能量球得到跳跃能量向更高的地方跳跃,如果图中碰到黑洞就挂了- 在游戏调试过程中如果能实时知道主角的高度就好了,这将有助于程序猿动态的判断游戏胜败逻辑. 你可以 ...
- LibVLC自定义插件目录,获取FPS方法
一.自定义插件目录 在Windows平台,使用LibVLC,只需要在VLC官网的nightly builds下载最新的win32 debug或win64 debug包, 解压缩之后,会有libvlc. ...