C语言如何很好的解析字符串
"direct usb://Canon/MX420%20series?serial=312E7C&interface=1 "Canon MX420 series" "Canon MX420 series" "MFG:Canon;CMD:BJL,BJRaster3,BSCCe,NCCe,IVEC,IVECPLI;SOJ:BJNP2,BJNPe;MDL:MX420 series;CLS:PRINTER;DES:Canon MX420 series; VER:1.020;STA:10;FSI:04;HRI:CHN;MSI:DAT,E3,HASF;PDR:7;PSE:LFBA05000;"
比如上面字符串中包含了很多信息,要提取出来如何提取呢?
比如这里要:MFG,MDL和DES。
MFG=Canon
MDL=MX420
DES="Canon MX420 series"
------解决方案--------------------
试试正则表达式呢?
------解决方案--------------------
引用:Quote: 引用:试试正则表达式呢?
你说的是awk和sed吧。基础条件不是太好,能不能用纯语言实现呢?
不是,你可以用pcre这种东西还是不错的。如果用纯C实现的话,不是不可以,但比较麻烦而且灵活性什么都受限制。
------解决方案--------------------
只要格式固定,没难度吧?
------解决方案--------------------
好像有某些规律
可以用strtok 提取“;”分割的各部分,然后再用sscanf提取“:”左右两边的字符串。
------解决方案--------------------
原始方法,指针自增遍历字符串,匹配成功记录下对应值。
------解决方案--------------------
regex.h
------解决方案--------------------
#include
#include
char s[]="direct usb://Canon/MX420%20series?serial=312E7C&interface=1 \"Canon MX420 series\" \"Canon MX420 series\" \"MFG:Canon;CMD:BJL,BJRaster3,BSCCe,NCCe,IVEC,IVECPLI;SOJ:BJNP2,BJNPe;MDL:MX420 series;CLS:PRINTER;DES:Canon MX420 series; VER:1.020;STA:10;FSI:04;HRI:CHN;MSI:DAT,E3,HASF;PDR:7;PSE:LFBA05000;";
char *p;
char MFG[40];
char MDL[40];
char DES[40];
int main() {
p=strstr(s,"MFG:");if (p && 1==sscanf(p,"MFG:%39[^;]",MFG)) printf("MFG=[%s]\n",MFG);
p=strstr(s,"MDL:");if (p && 1==sscanf(p,"MDL:%39[^;]",MDL)) printf("MDL=[%s]\n",MDL);
p=strstr(s,"DES:");if (p && 1==sscanf(p,"DES:%39[^;]",DES)) printf("DES=[%s]\n",DES);
return 0;
}
//MFG=[Canon]
//MDL=[MX420 series]
//DES=[Canon MX420 series]
//
------解决方案--------------------
这个自己根据实际情况来吧!
------解决方案--------------------
引用:Quote: 引用:#include
#include
char s[]="direct usb://Canon/MX420%20series?serial=312E7C&interface=1 \"Canon MX420 series\" \"Canon MX420 series\" \"MFG:Canon;CMD:BJL,BJRaster3,BSCCe,NCCe,IVEC,IVECPLI;SOJ:BJNP2,BJNPe;MDL:MX420 series;CLS:PRINTER;DES:Canon MX420 series; VER:1.020;STA:10;FSI:04;HRI:CHN;MSI:DAT,E3,HASF;PDR:7;PSE:LFBA05000;";
char *p;
char MFG[40];
char MDL[40];
char DES[40];
int main() {
p=strstr(s,"MFG:");if (p && 1==sscanf(p,"MFG:%39[^;]",MFG)) printf("MFG=[%s]\n",MFG);
p=strstr(s,"MDL:");if (p && 1==sscanf(p,"MDL:%39[^;]",MDL)) printf("MDL=[%s]\n",MDL);
p=strstr(s,"DES:");if (p && 1==sscanf(p,"DES:%39[^;]",DES)) printf("DES=[%s]\n",DES);
return 0;
}
//MFG=[Canon]
//MDL=[MX420 series]
//DES=[Canon MX420 series]
//
给跪了!
由此引发了一个问题,我得自己好好深思一下,C语言学习一个半吊子就自认为不错了,就有点不思进取了。能达到像赵老师这样指哪打哪才是说的过去的。不仅要得到鱼还要渔。
知识点1:字符串中的半角双引号需用\"表示
知识点2:strstr(ss,s)函数返回NULL或s在ss中第一次出现的地址
知识点3:sscanf函数的返回值表示成功扫描并赋值的参数个数
知识点4:sscanf函数的格式串中出现非%开头的内容表示要求输入对应内容
知识点5:sscanf函数的格式串中%39[^;]表示读取最多39个非;字符到对应字符串变量中
知识点6:为看清一个字符串的头尾是否包含看不见的空格,用[%s]格式输出
知识点7:填表式编码风格http://bbs.csdn.net/topics/380157851
------解决方案--------------------
C程序员对
printf、sprintf、fprintf
scanf、sscanf、fscanf
这两类函数的使用熟悉程度还是要做到“拳不离手,曲不离口。”的。
#include
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
p=s;
while (1) {
k=sscanf(p,"%d%n",&v,&n);
printf("k,v,n=%d,%d,%d\n",k,v,n);
if (1==k) {
p+=n;
} else if (0==k) {
printf("skip char[%c]\n",p[0]);
p++;
} else {//EOF==k
break;
}
}
printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]