打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

来源:物联网IoT开发

今天分享个源码吧,用在解析云端数据的。

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

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


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

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('开始
');

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

1    rData = SearchNum(str,'AB=',50,3,&data,4);
2
3    printf('rData = %d
',rData);
4
5    printf('data = %d
',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);

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

最后

这个源码在我之前写的解析云端数据并不是这样子的,具体怎么用,看大家的需求了,而且源码有一个很大的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('开始
');
87
88    printf('str = %s
',str);
89    rData = SearchNum(str,'AB=',50,3,&data,9);
90
91    printf('rData = %d
',rData);
92
93    printf('data = %d
',data);
94}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
基于英文单词的快速HASH索引算法_小徐博客 学无止境 minix and linux
从VC++ 编辑的DLL过程(或函数)向VB 传递字符串的方法(简单实用版)
嵌入式开发C语言编程的那些编程思路与技巧
C语言sprintf与sscanf函数[总结]
golang cgo 使用总结
C字符串 与 uint32类型互相转换
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服