在这个uint8数组中搜索模式的更优雅方式

时间:2016-07-21 09:31:36

标签: c

我在嵌入式系统中使用C语言。我有这个uint8数组。

static uint8_t data_array[20];

data_array的内容以'\n'终止。

我想检查前3个字节是否为“ABC”。我就是这样做的。

if (data_array[0]=='A' && data_array[1]=='B' && data_array[2]=='C')
{
    printf("pattern found\n");
}

是否有更优雅的方法来检测模式?如果模式由10个字节组成,我的方法可能很麻烦。

4 个答案:

答案 0 :(得分:0)

只需使用循环:

std::bind

Live code here

答案 1 :(得分:0)

strncmp()怎么样?

static uint8_t data_array[20];

if(strncmp(data_array, "ABC", 3) == 0)
{
   printf("pattern found\n");
}

答案 2 :(得分:-1)

char small='a' ,big='A';
int i=0;
char arr[10];

//To check 

for(i; i<10 ; i++)
{


    if(arr[i]==small || arr[i]==big)
    {
          //what you want to do 
    }
    small++;
    big++;



}

答案 3 :(得分:-1)

您可以使用宏来生成类似于您的代码:

#include <stdio.h>


#define TEST_FIRST_1(arr, c0)       ((c0) == *(arr))
#define TEST_FIRST_2(arr, c0, ...)  (TEST_FIRST_1(arr, c0) && TEST_FIRST_1((arr) + 1, __VA_ARGS__))
#define TEST_FIRST_3(arr, c0, ...)  (TEST_FIRST_1(arr, c0) && TEST_FIRST_2((arr) + 1, __VA_ARGS__))
#define TEST_FIRST_4(arr, c0, ...)  (TEST_FIRST_1(arr, c0) && TEST_FIRST_3((arr) + 1, __VA_ARGS__))
#define TEST_FIRST_5(arr, c0, ...)  (TEST_FIRST_1(arr, c0) && TEST_FIRST_4((arr) + 1, __VA_ARGS__))
/* continue, if need */


static unsigned char data[30] = {
    1,2,3,4,5,6,7,8,9,10,11,12,13,
};

int main(int argc, char **argv)
{
    /* true cases */
    printf("%d\n", TEST_FIRST_1(data, 1));
    printf("%d\n", TEST_FIRST_2(data, 1, 2));
    printf("%d\n", TEST_FIRST_3(data, 1, 2, 3));
    printf("%d\n", TEST_FIRST_4(data, 1, 2, 3, 4));
    printf("%d\n", TEST_FIRST_5(data, 1, 2, 3, 4, 5));

    /* false cases */
    printf("%d\n", TEST_FIRST_5(data, 0, 0, 0, 0, 0));
    printf("%d\n", TEST_FIRST_4(data, 0, 0, 0, 0));
    printf("%d\n", TEST_FIRST_3(data, 0, 0, 0));

    return 0;
}

初看时可能看起来不干净,但无论如何都不会导致为模式创建额外的字符串文字来与之比较。