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

然后找出搜寻字符串在数组中的位置,并且把字符串的后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 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;i31    { 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阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分