sscanf函数用来从给定字符串中读取所需数据,用在一些数据转换时比较方便。常见用法和scanf类似,用%s,%d等获取字符串和整数。但在%号后可以支持更多的格式,甚至是正则表达式,这样一来sscanf的功能就比较强大了。
sscanf函数的原型:int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
其中的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的任意字符,(尽可能多的匹配)
常见的用法举例:读取字符串和数字,并打印等。
sscanf读取字符串或数字时,默认以空格作为分割。如果一个字符串中没有空格,那么我们就需要使用正则表达式来精确匹配读取字符串。
如下题:
char cText[100] =“Cmd=load|Jid=test1|Tid=2|Num=1342|;”
现在需要把cText的内容中的
Jid的值存放到一维数组cJob[20]中;
Tid的值存放到变量int nTid中;
Num的值存放到变量long long int ll_num中。
分析:
第一:Cmd的值需要过滤掉,这可以通过*来实现
第二:Jid的值如果直接通过%s来获取的话,那么没有空格,会把整个字符串都读取了,所以需要用正则表达式的方法。
解答如下图:
sscanf函数的返回值表示本次读取的数据个数,可以用来判断读取数据是否成功!再结合正则表达式,sscanf就可以实现一些更高级的功能!
如下题:
用sscanf将char cSrc[30]="123abcde4567cbd89fwerdf"的数字小于5的 和 字符'b'至'f'的取出来,保存到数组char *cDest中;
分析:
1. 数字小于5和字符在'b'和'f'的正则表达式:[0-5|b-f]
2. 可以利用一个循环,先读取[0-5|b-f]的数据,如果不成功再过滤不在这个范围的字符串
解答如下图:
最后再举例format中width的使用。width表示读取多少个字符串。
如下题:
用sscanf将char cSrc[10]="123456789"的前5位保存到数组char cDest[6]中
解答如下图:
举报/反馈