#include <stdio.h> void* sub_find(const void* a, size_t n1, const void* b, size_t n2, size_t size, int (*pcmp)(const void*, const void*)){ const unsigned char* p1, *p2, *i, *j, *e1, *e2; if(n1 < n2) return NULL; p1 = (const unsigned char*)a; e1 = p1 + (n1 * size); p2 = (const unsigned char*)b; e2 = p2 + (n2 * size); for(; p1 < e1; p1 += size){ i = p1; j = p2; while((i < e1) && (j < e2) && (*pcmp)(i, j)){ i += size; j += size; } if(j == e2) return (void*)p1; } return NULL; } int icmp(const void* a, const void* b){ return *(int*)a == *(int*)b; } int scmp(const void* a, const void* b){ return *(short*)a == *(short*)b; } int dcmp(const void* a, const void* b){ return *(double*)a == *(double*)b; } int main(void){ short* sp; int* ip; double* dp; int i1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int i2[] = { 3, 4, 5 }; short s1[] = { 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x8, 0x9 }; short s2[] = { 0xD, 0xE, 0xF, 0x8 }; double d1[] = { 1.5, 0.5, 7.9, 3.4, 0.9, 4.7, 100.56, 44.4 }; double d2[] = { 0.5, 7.9 }; //для int ip = (int*)sub_find(i1, sizeof(i1)/sizeof(i1[0]), i2, sizeof(i2)/sizeof(i2[0]), sizeof(int), &icmp); if(ip != NULL){ while(ip != i1 + sizeof(i1)/sizeof(i1[0])) printf("%d ", *ip++); putchar('\n'); } //для short sp = (short*)sub_find(s1, sizeof(s1)/sizeof(s1[0]), s2, sizeof(s2)/sizeof(s2[0]), sizeof(short), &scmp); if(sp != NULL){ while(sp != s1 + sizeof(s1)/sizeof(s1[0])) printf("0x%X ", *sp++); putchar('\n'); } //для double dp = (double*)sub_find(d1, sizeof(d1)/sizeof(d1[0]), d2, sizeof(d2)/sizeof(d2[0]), sizeof(double), &dcmp); if(dp != NULL){ while(dp != d1 + sizeof(d1)/sizeof(d1[0])) printf("%lg ", *dp++); putchar('\n'); } return 0; }
memcmp( src, dest, sizeof(elm) * n )- nick_n_a