c语言 6-14 查找子串,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

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

169815365_1_20190831024511161

提取9位:1    rData = SearchNum(str,'AB=',50,3,&data,9);

169815365_2_20190831024511286

那个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

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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值