C语言如何很好的解析字符串

袁保康 2014-02-08 03:51:45
"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"
...全文
1149 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-02-21
  • 打赏
  • 举报
回复
作为一个C程序员,对 scanf,sscanf,fscanf printf,sprintf,fprintf 这类函数的用法,还是要做到“拳不离手,曲不离口”的。
nichengshishenme 2014-02-11
  • 打赏
  • 举报
回复
学习了!!!
ooolinux 2014-02-10
  • 打赏
  • 举报
回复
强大,学习了
赵4老师 2014-02-10
  • 打赏
  • 举报
回复
引用 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而被操作系统的内存管理模块强行终止的。
sevk 2014-02-10
  • 打赏
  • 举报
回复
C语言的sscanf()竟然有简单的正则功能,太强大了
袁保康 2014-02-10
  • 打赏
  • 举报
回复
引用 23 楼 hongqun 的回复:
我遇到字符中处理的问题,一般都丢给python去做,然后再返回到C中。当然了,python能做的事C也一定能做,只图个方便。
资源好的地方可以,嵌入式设备上没有空间移植python等等 因素就不能用了。:)
Super_HQ 2014-02-10
  • 打赏
  • 举报
回复
我遇到字符中处理的问题,一般都丢给python去做,然后再返回到C中。当然了,python能做的事C也一定能做,只图个方便。
袁保康 2014-02-10
  • 打赏
  • 举报
回复
引用 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] 后来明白了。您这是安全编程!
max_min_ 2014-02-09
  • 打赏
  • 举报
回复
这个自己根据实际情况来吧!
袁保康 2014-02-09
  • 打赏
  • 举报
回复
引用 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]
//
给跪了! 由此引发了一个问题,我得自己好好深思一下,C语言学习一个半吊子就自认为不错了,就有点不思进取了。能达到像赵老师这样指哪打哪才是说的过去的。不仅要得到鱼还要渔。
赵4老师 2014-02-09
  • 打赏
  • 举报
回复
#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]
//
赵4老师 2014-02-09
  • 打赏
  • 举报
回复
引用 18 楼 mLee79 的回复:
构造DFA呗, 啥语言都可以..
有用大炮打苍蝇之嫌。
mLee79 2014-02-09
  • 打赏
  • 举报
回复
构造DFA呗, 啥语言都可以..
袁保康 2014-02-09
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
补充一个知识点:if (A && B)会发生逻辑短路,即A为0或NULL时,不会计算B
这个知识点是了解的,字符串格式是固定的,如果出现null了说明该消息是无效的,您的方法在这里是没有问题的。
赵4老师 2014-02-09
  • 打赏
  • 举报
回复
补充一个知识点:if (A && B)会发生逻辑短路,即A为0或NULL时,不会计算B
unmapped 2014-02-09
  • 打赏
  • 举报
回复
引用 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]
//
膜拜起来。万能的赵老师。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
赵4老师 2014-02-09
  • 打赏
  • 举报
回复
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.
赵4老师 2014-02-09
  • 打赏
  • 举报
回复
引用 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]
//
给跪了! 由此引发了一个问题,我得自己好好深思一下,C语言学习一个半吊子就自认为不错了,就有点不思进取了。能达到像赵老师这样指哪打哪才是说的过去的。不仅要得到鱼还要渔。[/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
WizardOz 2014-02-08
  • 打赏
  • 举报
回复
regex.h
陆小路 2014-02-08
  • 打赏
  • 举报
回复
原始方法,指针自增遍历字符串,匹配成功记录下对应值。
加载更多回复(7)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧