You can use macros to generate code similar to yours:
#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; }
It may seem that it is not clean at first glance, but in any case does not lead to the creation of additional string literals for comparing patterns.