gpt4 book ai didi

我们可以使用数组的空指针吗

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:56 24 4
gpt4 key购买 nike

我只是在研究一个自由函数,在这个函数中我们为学生和书定义了我们自己的数据类型我必须编写一个代码来通过 id 找到学生和通过 id 这两个函数。在这个函数中,我传递的指针是不同的,但逻辑是相同的,所以我想到为什么我们不能编写一个函数并传递我们想要的东西。我的意思是,当我们传递学生列表时,它将返回学生的索引;当我们传递书籍列表时,它将返回书籍的书籍索引。我们可以为此使用空指针吗???谢谢大家!!!

int findBookId(Book* booklist,int* bcount,unsigned int* tbid)
{
int i;
for (i=0; i<*bcount; i++)
{
if (booklist[i].id==*tbid)
{
return i;
}
}
return NOT_FOUND;
}

int findStuId(Student* stulist,int* scount,unsigned int* tsid)
{
int i;
for (i=0; i<*scount; i++)
{
if (stulist[i].id==*tsid)
{
return i;
}
}
return NOT_FOUND;
}

最佳答案

假设您有一个 student结构:

struct student {
int id;
char name[20];
};

可以模仿qsort()函数,设计一个参数来接收回调函数和接收每个元素的大小和大小,如果你想使用void * .

int find_ele(void *base, size_t num, size_t width,
int (*equal)(const void *, const void *),
void *param)
{
int i;

for (i = 0; i < num; ++i) {
if (equal((char *) base + i * width, param)) {
return i;
}
}

return -1;
}

然后,定义一个“tester”:

int student_tester(const void *p1, const void *p2)
{
struct student *sp = (struct student *) p1;
int id = *(int *) p2;
return sp->id == id;
}

main()功能:

int main(void)
{
struct student student_list[] = {
0, "A",
1, "B",
2, "C"
};

int id = 2;
int index = find_ele(student_list, sizeof student_list,
sizeof(struct student), student_tester, &id);
if (index != -1) {
printf("find_ele(id=2) = student_list[%d]; name = %s. \n",
index, student_list[index].name);
} else {
printf("Not found. \n");
}

return 0;
}

这有点复杂。如果您不在乎,可以创建宏来简化它。

重命名 find_ele_find_ele ,并创建一个宏:

#define find_ele(base, num, compare, param) _find_ele(base, \
num / sizeof base[0], \
sizeof base[0], \
compare, param)

并创建另一个宏来定义“测试器”:

#define define_tester(name, type, type_to_find, code) \
int name(const void *_p, const void *param) { \
type *p = (type *) _p; \
type_to_find value = *(type_to_find *) param; \
return (code); \
}

现在你可以像这样定义一个“tester”:

define_tester(student_tester, struct student, int,
p->id == value);

完整代码:

#include <stdio.h>

int _find_ele(void *base, size_t num, size_t width,
int (*equal)(const void *, const void *),
void *param)
{
int i;

for (i = 0; i < num; ++i) {
if (equal((char *) base + i * width, param)) {
return i;
}
}

return -1;
}

#define find_ele(base, num, compare, param) _find_ele(base, \
num / sizeof base[0], \
sizeof base[0], \
compare, param)

#define define_tester(name, type, type_to_find, code) \
int name(const void *_p, const void *param) { \
type *p = (type *) _p; \
type_to_find value = *(type_to_find *) param; \
return (code); \
}

struct student {
int id;
char name[20];
};

define_tester(student_tester, struct student, int,
p->id == value);

int main(void)
{
struct student student_list[] = {
0, "A",
1, "B",
2, "C"
};

int id = 2;
int index = find_ele(student_list, sizeof student_list, student_tester, &id);
if (index != -1) {
printf("find_ele(id=2) = student_list[%d]; name = %s. \n",
index, student_list[index].name);
} else {
printf("Not found. \n");
}

return 0;
}

关于我们可以使用数组的空指针吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22601112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com