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

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

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

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


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

 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);

image.png

提取9位:

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

image.png

那个rData = 1;是字符串“AB=”的首地址。

最后

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



test.c源码:

 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}



猜你喜欢

转载自blog.csdn.net/jiejiemcu/article/details/80861760