乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C語言字符串匹配與數(shù)據(jù)提取源碼

       西北望msm66g9f 2019-08-31

      來源:物聯(lián)網(wǎng)IoT開發(fā)

      今天分享個源碼吧,用在解析云端數(shù)據(jù)的。

      說的好像很高大上,但是其實是很簡單的,當然效率估計也不高,差不多就行了。

      作用:其實就是字符串的查找,然后提對應(yīng)字符串的數(shù)據(jù)出來。


      隨便創(chuàng)建一組數(shù)組,模擬單片機中接收的數(shù)據(jù)。

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

      然后找出搜尋字符串在數(shù)組中的位置,并且把字符串的后n位提取出來,我這是提取的是十進制數(shù)字。

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

      下面的這句代碼含義是:

      對比str字符串中的與“AB=”匹配的字符串(長度必須匹配),然后提取其后4位,并且將提取到的數(shù)據(jù) data 保存出來。

      注:str的內(nèi)容是:

      1str = aAB=123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^@
      1rData = SearchNum(str,'AB=',50,3,&data,4);

      源碼的實現(xiàn):

      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在規(guī)定的長度內(nèi)是否相等
      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}

      還有一個內(nèi)部調(diào)用的函數(shù):

      用來將字符轉(zhuǎn)換成十進制的數(shù)字,根據(jù)要提取多少位來方便提取。

      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}

      測試結(jié)果:(提取4位)

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

      提取9位:

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

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

      最后

      這個源碼在我之前寫的解析云端數(shù)據(jù)并不是這樣子的,具體怎么用,看大家的需求了,而且源碼有一個很大的bug,就是無法搜索到下一個與“AB=”一樣的字符串,應(yīng)用并不是很大。當然能改進啊,看大家來改進了,假如字符串長度不匹配,可以進行重新查找,只需在不匹配的地方往后移動seachLen就好了。假如有多個一樣的字符串,這可以用一個鏈表來保存這些數(shù)據(jù)。如字符串在原字符串中的位置,其后面的數(shù)據(jù)等等。

      附上源碼

       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在規(guī)定的長度內(nèi)是否相等
      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}

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多