user-0 提问: C语言如何很好的解析字符串

回复:
user: user-1
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-2
content: 学习了！！！

user: user-3
content: 强大，学习了

user: user-1
content: 引用 17 楼 kangear 的回复:[quote=引用 16 楼 zhao4zhong1 的回复:] 补充一个知识点：if (A && B)会发生逻辑短路，即A为0或NULL时，不会计算B 这个知识点是了解的，字符串格式是固定的，如果出现null了说明该消息是无效的，您的方法在这里是没有问题的。[/quote] 我的意思是如果没有逻辑短路机制，当p==NULL时， if (p && 1==sscanf(p,"MFG:%39[^;]",MFG))这句话会导致读内存00000000而被操作系统的内存管理模块强行终止的。

user: user-4
content: C语言的sscanf()竟然有简单的正则功能，太强大了

user: user-0
content: 引用 23 楼 hongqun 的回复:我遇到字符中处理的问题，一般都丢给python去做，然后再返回到C中。当然了，python能做的事C也一定能做，只图个方便。 资源好的地方可以，嵌入式设备上没有空间移植python等等　因素就不能用了。:)

user: user-5
content: 我遇到字符中处理的问题，一般都丢给python去做，然后再返回到C中。当然了，python能做的事C也一定能做，只图个方便。

user: user-0
content: 引用 21 楼 zhao4zhong1 的回复:[quote=引用 17 楼 kangear 的回复:] [quote=引用 16 楼 zhao4zhong1 的回复:] 补充一个知识点：if (A && B)会发生逻辑短路，即A为0或NULL时，不会计算B 这个知识点是了解的，字符串格式是固定的，如果出现null了说明该消息是无效的，您的方法在这里是没有问题的。[/quote] 我的意思是如果没有逻辑短路机制，当p==NULL时， if (p && 1==sscanf(p,"MFG:%39[^;]",MFG))这句话会导致读内存00000000而被操作系统的内存管理模块强行终止的。[/quote] 后来明白了。您这是安全编程！

user: user-6
content: 这个自己根据实际情况来吧！

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:#include <stdio.h> #include <string.h> 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] //   给跪了！  由此引发了一个问题，我得自己好好深思一下，Ｃ语言学习一个半吊子就自认为不错了，就有点不思进取了。能达到像赵老师这样指哪打哪才是说的过去的。不仅要得到鱼还要渔。

user: user-1
content: #include <stdio.h> #include <string.h> 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] //

user: user-1
content: 引用 18 楼 mLee79 的回复:构造DFA呗, 啥语言都可以.. 有用大炮打苍蝇之嫌。

user: user-7
content: 构造DFA呗, 啥语言都可以..

user: user-0
content: 引用 16 楼 zhao4zhong1 的回复:补充一个知识点：if (A && B)会发生逻辑短路，即A为0或NULL时，不会计算B 这个知识点是了解的，字符串格式是固定的，如果出现null了说明该消息是无效的，您的方法在这里是没有问题的。

user: user-1
content: 补充一个知识点：if (A && B)会发生逻辑短路，即A为0或NULL时，不会计算B

user: user-8
content: 引用 10 楼 zhao4zhong1 的回复:#include <stdio.h> #include <string.h> 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] //    膜拜起来。万能的赵老师。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

user: user-1
content: C程序员对 printf、sprintf、fprintf scanf、sscanf、fscanf 这两类函数的使用熟悉程度还是要做到“拳不离手，曲不离口。”的。 #include <stdio.h> 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] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-1
content: 引用 11 楼 kangear 的回复:[quote=引用 10 楼 zhao4zhong1 的回复:] #include <stdio.h> #include <string.h> 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] 知识点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

user: user-9
content: regex.h

user: user-10
content: 原始方法，指针自增遍历字符串，匹配成功记录下对应值。