函数sscanf()用法

本文转载至:http://blog.csdn.net/shuaishuai80/article/details/6139453

printf()或者sprintf()一定是任何一个C程序员最常见到的函数,与sprintf的作用相反,sscanf通常被用来解析并转换字符串,其格式定义灵活多变,可以实现很强大的字符串解析功能.

sscanf的原型很简单,定义如下:

<span style="white-space:pre">	</span>#include <stdio.h>
<span style="white-space:pre">	</span>int sscanf(const char *str, const char *format, ...);

str:待解析的字符串 
format: 字符串格式描述,其后是一序列数目不定的指针参数,存储解析后的数据

例1:

     int year, month, day; 
     int converted = sscanf("20080808", "%04d%02d%02d", &year, &month, &day);
     printf("converted=%d, year=%d, month=%d, day=%d\n", converted, year, month, day); 

输出结果: 

     converted=3, year=2008, month=8, day=8 


"%04d%02d%02d"是用来解析字符串的格式,%表示格式转换的开始,d表示转换为一个整数,04作为d的修饰,表示这是一个长度为4位的整数,不足4位时以0补齐。例子返回结果等于3,表示有3个数据成功转换,转换成功数目同时取决于被解析的字符串以及其转换格式,如果我们把例子中的格式改为"%04d%02d",那么sscanf将只返回2,day的数值不会被sscanf更改。


例2: 

     double longitude, latitude;
     int converted = sscanf("113.123456789 31.123456789", "%lf %lf", &longitude, &latitude);
     printf("converted=%d, longitude=%.9lf, latitude=%lf\n", converted, longitude, latitude); 

输出结果: 
     converted=2, longitude=113.123456789, latitude=31.123457 
     sscanf的格式字符串中,f表示这是一个浮点数,其修饰词l表示这是一个double的浮点数。


例3:

     char str[32] = "";
     sscanf("123456abcdedf", "%31[0-9]", str);
     printf("str=%s\n", str); 

输出结果: 
     str=123456 

上面的格式中,[0-9]表示这是一个仅包含0-9这几个字符的字符串,前面使用数字31修饰词表示这个字符串缓冲区的最大长度(这也是sscanf最为人诟病的地方,很容易出现缓冲区溢出错误,实际上sscanf是可以避免出现缓冲区溢出的,只要在书写任何字符串解析的格式时,注意加上其缓冲区尺寸的限制)。
   
例4:修饰符[] 

     char str[32] = "";
     sscanf("123456abcdedf", "%31[0-9a-z]", str);
     printf("str=%s/n", str); 

输出结果: 
     str=123456abcdedf 
     在格式[]中增加了a-z的描述。


例5:修饰符[]

     char str[32] = "";
     sscanf("123456abcdedf", "%31[^a-z]", str);
     printf("str=%s/n", str); 

输出结果: 
     str=123456 
     在[]中增加^表示相反的意思,上面的[^a-z]表示一个不包含任何a-z之间的字符串。


例6:修饰符*和[]

     char str[32] = "";
     int ret = sscanf("123456abcdedf", "%*[0-9]%31[a-z]", str);
     printf("ret=%d, str=%s/n",ret, str); 

输出结果: 
     ret=1, str=abcdedf 
加上*修饰表示一个被忽略的数据,同时也不需要为它准备空间存放解析结果.如上面的例子中,我们就只使用了str一个参数存%31[a-z]的解析结果,而sscanf也只返回1,表示只解析了一个数据。

例7:修饰符*和[]

     char str1[32] = "";
     char str2[32] = "";
     char str3[32] = "";
     char str4[32] = "";
     int ret = sscanf("111abc222edf333ghi444qwer", "%[0-9]%*[a-z]%[0-9]%*[a-z]%[0-9]%*[a-z]%[0-9]%*[a-z]", str1, str2, str3, str4);
     printf("ret=%d, str1=%s, str2=%s, str3=%s, str4=%s/n",ret, str1, str2, str3, str4);

输出结果:

     ret=4, str1=111, str2=222, str3=333, str4=444


【attention】下面是format的一些参考资料 
转换类型: 
%d 整数,需要一个类型为int*的的参数存放转换结果. 
%i     整数,如果字符串以0x或者0X开头,则按16进制进行转换,如果以0开头,则按8进制进行转换,否则按10进制转换,需要一个类型为int*的的参数存放转换结果. 
%o 无符号的8进制数,需要一个类型为unsigned int*的参数存放转换结果. 
%u 无符号的整数,需要一个类型为unsigned int*的参数存放转换结果. 
%x 无符号的16进制数,需要一个类型为unsigned int*的参数存放转换结果. 
%X 等同于%x. 
%f 浮点数,需要一个类型为float*的参数存放转换结果. 
%c 单个字符,需要一个类型为char*的参数存放转换结果. 
%s 以空格或者换行符结尾的字符串,需要一个类型为char*的参数存放转换结果. 
%[] 仅包含在[]中的字符的字符串,如[0-9]表示一个全部是数字的字符串,[a-z]表示一个全部为小写字母的字符串,需要一个类型为char*的参数存放转换结果. 
%[^] 与上面相反,[^之后,]之前的所有字符都作为字符串结束标志,如[^0-9]表示一个不包含任何0-9的字符串,需要一个类型为char*的参数存放转换结果.

【attention】转换类型修饰符 
* 忽略标志,如%*d表示忽略一个整数,%*s表示忽略一个字符串 
h short修饰符,如%hd表示这是一个short int的整数 
l long修饰符,如%ld表示这是一个long int的整数, %lf表示这是一个double的浮点数(%f表示一个float的浮点数) 
L <GCC> long long修饰符,如%Ld表示这是一个64位字节的整数, %Lf表示这是一个long double的浮点数 
I64 <VisualC++> __int64修饰符,如%I64d表示这是一个64位字节的整数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值