#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<assert.h>
//任意类型的查找,elemsize指定单个元素的大小
int search(void* sour, void* targetElem, size_t sourLen, size_t elemsize)
{
assert(sour != NULL);
void* elemTemp;
for (int i = 0; i < sourLen; i++)
{
elemTemp =(char*)(sour)+i*elemsize;//获取第i个元素
if (memcmp(elemTemp, targetElem,elemsize) == 0)
return i;
}
return -1;
}
//自定义比较函数
int searchByCmp(void* sour, void* targetElem, size_t sourLen, size_t elemsize, int (*cmpfun)(void*, void*))
{
assert(sour != NULL);
void* elemTemp;
for (int i = 0; i < sourLen; i++)
{
elemTemp = (char*)sour+i*elemsize;
if (cmpfun(elemTemp, targetElem)==0)
return i;
}
return -1;
}
int cmpFunForStr(void* vp1, void* vp2)
{
char* s1 = *((char**)vp1);//这里获取值而非地址
char* s2 = *((char**)vp2);
printf("s1:%s, s2:%s\n", s1, s2);
return strcmp(s1,s2);
}
int main(int argc,char *argv[]){
int intArray[] = {4, 5};
int intTarget = 5;
assert(search(intArray, &intTarget, 2, sizeof(intTarget)) == 1);
printf("success for int\n");
double doubleArray[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
double doubleTarget = 2.0;
assert(search(doubleArray, &doubleTarget, 2, sizeof(doubleTarget)) == 1);
printf("success for double\n");
char* strArray[] = {"hello", "world", "2023"};
char* strTarget = "world";
assert(searchByCmp(strArray, &strTarget, 3, sizeof(char *), cmpFunForStr) == 1);
printf("end\n");
return 0;
}