正则表达式 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);