正则表达式 sscanf
名称:sscanf()-从一个字符串中读进与指定格式相符的数据.
语法:intsscanf(stringstr,stringfmt,mixedvar1,mixedvar2...);
整数sscanf(字符串str,字符串fmt,混合var1,混合var2...);
用法:以指定的格式fmt去解读字符串str.fmt中除了%d和%s以外,亦可包含其他的字符串作为格式.每一个%d或%s都对应一个参数,按顺序为var1,var2...%d读入一个整数到参数中,而%s读入一个字符串.*亦可用于格式中,(即%*d和%*s)加了星号(*)表示跳过此数据不读入.(也就是不把此数据读入参数中)LPC的sscanf()与C的sscanf()虽然相似,但仍有不同之处.LPC的sscanf()不需要(也不可)提供变量的内存位址给sscanf(),只需要给予变量的名字.另一个不同点是,LPC的sscanf()对于:sscanf(str,"%s%s",str1,str2);的语法,将会把str中的第一个英文单字(即第一个空白字符以前的内容)读入str1,后面其余的内容读入str2.
sscanf()会返回符合格式的%d和%s总数.
一个文本文件,每行是一条记录,每条记录中包含多个字段,每个字段之间以某种定界符分开,举例如下:
Notebook,IBM,ThinkPadX32,6,12000
(各字段以逗号分隔,内容依次是:物品名称,生产厂家,型号,数量,价格)
如果要对这样的一行记录进行处理,提取出各个字段,怎么做比较好呢?
以前的做法是在一个循环中用strtok函数每次取一个字段,然后将内容保存到一个字符串数组中。
用C的标准库函数sscanf,处理这样的数据,只需一行就可以了。
floatprice;
intquantity;
charcategory[21],name[21];
charvendor[21],sku[21];
charbuf[201];
fp=fopen(filename,"r");
fgets(buf,200,fp);
sscanf(buf,
"%20[^#]#%20[^#]#%f#%i#%20[^#]#%20[^\n]",
name,sku,&price,&quantity,category,vendor);
下面简单做些解说:
%20[^#]#最多读入20个字符,直到遇见定界符#,但不包含定界符
%f#读入一个浮点数,直到遇见定界符#
%i#读入一个整数,直到遇见定界符#
%20[^\n]最多读入20个字符,忽略行尾的回车符
是不是很简洁明了呢?
charlog[]="2002-11-1112:12:1211.22.33.4433aaaaaaaaaa";
//charlog[]="2002-11-1112:12:1211.22.33.443aaaaaaaaaa";
chartest[]="22";
charlog2[200];
charstr1[20];
charstr2[20];
charstr3[20];
charstr4[20];
charstr5[20];
charstr6[20];
charstr7[20];
inta1,a2,a3,a4,a5,a6;
sscanf(log,"%s%s%s%d%d%s",&a1,str2,str3,str4,&a5,&a6,str7);
sscanf(test,"%d",&a5,&a6);
sscanf(log,"]>%[^]%[^]%[^]%[^]%[^]%[^$]",str1,str2,str3,str4,str5,str6,str7);