我一直试图解决这个bsearch作业问题一段时间了。我尝试使用我的代码首先搜索一个条目,如下所示:
int Compare(const void *a, const void *b);
void SortStudents(char *studentList[], size_t studentCount)
{
qsort(studentList, studentCount, sizeof(studentList[0]), Compare);
}
int Compare(const void *a, const void *b)
{
return (strcmp(*(char **)a, *(char **)b));
}
char *SearchList(char *key, char *list[], size_t num)
{
char **value = bsearch(&key, list, num, sizeof(list[0]), Compare);
return (value == 0 ? 0 : *value);
}
/*Determines which registrants did not attend the first meeting by searching for registrants
that are not in attendees set. */
void DisplayClassStatus(
const char *registrants[], size_t registrantCount,
const char *attendees[], size_t attendeeCount)
{
char *missedFirstMeeting = SearchList((char *)registrants[0], (char **)attendees, attendeeCount);
}
我的missFirstMeeting似乎可以正常调用单个值,但是当我尝试在循环中重复调用我的SearchList函数时,这样:
for (int i = 0; i < attendeeCount; i++) {
*missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
}
我收到了分段错误错误。对我来说,似乎我在做同样的事情,但只是反复调用SearchList(),但显然有些错误,我没有看到,因为我得到了分段错误。有任何想法吗?感谢。
答案 0 :(得分:2)
删除firstMeeting的前导'*':
missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
答案 1 :(得分:1)
好的,所以问题如下,你迭代registrants
,但是当它被截获attendeeCount
项时你的停止。而且,如果missedFirstMeeting
是char *,就像tur1ng所说的那样,你需要删除前导*。所以这样做:
for (int i = 0; i < registrantCount; i++) {
missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
/* Code that uses missedFirstMeeting here */
}
编辑:
如果您想保留所有SearchList
返回值,那么您应该执行以下操作:
char** missedFirstMeething = malloc(sizeof(char*)*registrantCount);
for (int i = 0; i < registrantCount; i++) {
missedFirstMeeting[i] = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
}
当然,在使用missedFirstMeeting
之后,你应该释放分配的内存。
答案 2 :(得分:0)
好的,您需要将返回值函数放入变量中。我写C ++是为了谋生,我的老板永远不会接受这样的代码。这段代码很难阅读,甚至更难调试。原因是因为您可以为变量设置监视。您还可以看到当您逐行浏览程序时程序是如何链接的。调试器将列出名称空间中的所有变量及其对应的值。我打赌钱,当你重写这个更具可读性时,你会发现自己的问题。
答案 3 :(得分:0)
我在代码中看到(至少)两个问题。
首先,琐碎而严肃的是for
循环应该比较i与registrantCount
而不是attendeeCount
。
应该写第二个Compare():
int Compare(const void *a, const void *b)
{
return (strcmp((char *)a, *(char *)b));
}
你只需要将void指针强制转换为char指针。修复这些应修复您的SegFault错误。
击>
已添加: for循环中missedFirstMeeting
的解除引用是两个主要问题之一。
for (i = 0; i < registrantCount; i++) {
missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
}
指针转换很难阅读。
答案 4 :(得分:0)
问题是虽然计算机是可变内存的大块,但这并不是编程时想象它们的最佳方式。你以这种方式对计算机进行了建模,但它并没有完全解决。