c语言字符串能怎么表示什么,C语言怎么很好的解析字符串

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]

//

给跪了!

1259213507.gif

由此引发了一个问题,我得自己好好深思一下,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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值