我在嵌入式系统中使用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个字节组成,我的方法可能很麻烦。
答案 0 :(得分:0)
答案 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;
}
初看时可能看起来不干净,但无论如何都不会导致为模式创建额外的字符串文字来与之比较。