搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 创客飞梦空间 > C语言字符串匹配与数据提取源码

C语言字符串匹配与数据提取源码

创客飞梦空间 2018-06-30

    大家晚上好,期末考试终于考完,我也有空写点东西了,回想起来也有两个星期没写文章了,现在分享个源码吧,我用在解析云端数据的,当然,我今天修改了一下的。

    说的好像很高大上,但是其实是很简单的,当然效率估计也不高,差不多就行了。

作用:其实就是字符串的查找,然后提对应字符串的数据出来。


随便创建一组数组,模拟单片机中接收的数据。

 1    char j = '1';
2    str[0] = 'a';
3    str[1] = 'A';
4    str[2] = 'B';
5    str[3] = '=';
6    for(i=4;i<50;i++)
7     {
8        str[i] = j;
9        j++;
10     }
11    printf("开始\r\n");

然后找出搜寻字符串在数组中的位置,并且把字符串的后n位提取出来,我这是提取的是十进制数字。

1    rData = SearchNum(str,"AB=",50,3,&data,4);
2
3    printf("rData = %d\r\n",rData);
4
5    printf("data = %d\r\n",data);

下面的这句代码含义是:

对比str字符串中的与“AB=”匹配的字符串(长度必须匹配),然后提取其后4位,并且将提取到的数据 data 保存出来。

注:str的内容是:

1str = aAB=123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^@


1rData = SearchNum(str,"AB=",50,3,&data,4);

源码的实现:

 1u16  SearchNum( u8 *inBuf,u8 *searchBuf, u16  dataLen,u8 seachLen,unsigned long *data,u8 seachNumLen)
2{
3    u16 i,rData;
4    u8  useData =0 ;
5    i =0;
6//查找第一个字母
7    for(; i!= dataLen; i++)
8    {
9        if(inBuf[i] == searchBuf[0])
10        {
11            break;
12        }
13    }
14//比对长度
15    rData =ibuffercmp(&inBuf[i], searchBuf, seachLen);
16    if(rData == 0)
17    {
18        *data = GetSearchNum(&inBuf[i+seachLen],seachNumLen);
19
20        return  rData+i;
21
22    }
23    return 0;
24}

对比字符串长度的源码:

这种很简单啦!!!

 1//检测buf1和buf2在规定的长度内是否相等
2uint8_t ibuffercmp(uint8_t* buffer1, uint8_t* buffer2, uint16_t len)
3{
4    while(len--)
5        {
6        if(*buffer1 != *buffer2)
7            {
8            return 1;
9            }
10        buffer1++;
11        buffer2++;
12        }
13    return 0;
14}

还有一个内部调用的函数:

用来将字符转换成十进制的数字,根据要提取多少位来方便提取。

 1static unsigned long GetSearchNum(u8 *inBuf,u16 seachLen)
2
{
3    int i,k,j=seachLen;
4    u8 data1[seachLen];
5    unsigned long data2=0;
6    unsigned long num = 1;
7    for(i=0;i<j;i++)
8    {
9      if((*inBuf >= '0')&&(*inBuf <= '9'))
10        {
11            num = 1;
12            k = seachLen-1;
13            for(k;k>0;k--)
14                num *= 10;
15            data2 += (*inBuf-'0')*num;
16            seachLen--;
17        }
18        inBuf++;
19    }
20        return data2;
21}

测试结果:(提取4位)

1    rData = SearchNum(str,"AB=",50,3,&data,4);

提取9位:

1    rData = SearchNum(str,"AB=",50,3,&data,9);

C语言字符串匹配与数据提取源码

最后

这个源码在我之前写的解析云端数据并不是这样子的,具体怎么用,看大家的需求了,而且源码有一个很大的bug,就是无法搜索到下一个与“AB=”一样的字符串,应用并不是很大。当然能改进啊,看大家来改进了,假如字符串长度不匹配,可以进行重新查找,只需在不匹配的地方往后移动seachLen就好了。假如有多个一样的字符串,这可以用一个链表来保存这些数据。如字符串在原字符串中的位置,其后面的数据等等。

附上源码

 1#include "stdio.h"
2
3typedef unsigned          char uint8_t;
4typedef unsigned short     int uint16_t;
5
6typedef unsigned          char u8;
7typedef unsigned short     int u16;
8
9//检测buf1和buf2在规定的长度内是否相等
10uint8_t ibuffercmp(uint8_t* buffer1, uint8_t* buffer2, uint16_t len)
11{
12    while(len--)
13        {
14        if(*buffer1 != *buffer2)
15            {
16            return 1;
17            }
18        buffer1++;
19        buffer2++;
20        }
21    return 0;
22}
23
24static unsigned long GetSearchNum(u8 *inBuf,u16 seachLen)
25
{
26    int i,k,j=seachLen;
27    u8 data1[seachLen];
28    unsigned long data2=0;
29    unsigned long num = 1;
30    for(i=0;i<j;i++)
31    {
32      if((*inBuf >= '0')&&(*inBuf <= '9'))
33        {
34            num = 1;
35            k = seachLen-1;
36            for(k;k>0;k--)
37                num *= 10;
38            data2 += (*inBuf-'0')*num;
39            seachLen--;
40        }
41        inBuf++;
42    }
43        return data2;
44}
45
46u16  SearchNum( u8 *inBuf,u8 *searchBuf, u16  dataLen,u8 seachLen,unsigned long *data,u8 seachNumLen)
47
{
48    u16 i,rData;
49    u8  useData =0 ;
50    i =0;
51//查找第一个字母
52    for(; i!= dataLen; i++)
53    {
54        if(inBuf[i] == searchBuf[0])
55        {
56            break;
57        }
58    }
59//比对长度
60    rData =ibuffercmp(&inBuf[i], searchBuf, seachLen);
61    if(rData == 0)
62    {
63        *data = GetSearchNum(&inBuf[i+seachLen],seachNumLen);
64
65        return  rData+i;
66
67    }
68    return 0;
69}
70
71int main()
72
{
73    int rData,i;
74    unsigned long data;
75    u8 str[50];
76    char j = '1';
77    str[0] = 'a';
78    str[1] = 'A';
79    str[2] = 'B';
80    str[3] = '=';
81    for(i=4;i<50;i++)
82     {
83        str[i] = j;
84        j++;
85     }
86    printf("开始\r\n");
87
88    printf("str = %s\r\n",str);
89    rData = SearchNum(str,"AB=",50,3,&data,9);
90
91    printf("rData = %d\r\n",rData);
92
93    printf("data = %d\r\n",data);
94}

杰杰原创,转载请说明出处


往期 精彩回顾








欢迎大家一起来讨论操作系统的知识

我们的群号是:783234154

创客:

欢迎大家分享出去

也欢迎大家投稿



版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《C语言字符串匹配与数据提取源码》的版权归原作者「创客飞梦空间」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注创客飞梦空间微信公众号

创客飞梦空间微信公众号:gh_3b8c12bf3706

创客飞梦空间

手机扫描上方二维码即可关注创客飞梦空间微信公众号

创客飞梦空间最新文章

精品公众号随机推荐