0

一段时间以来,我一直在尝试解决这个 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);
}

我的missedFirstMeeting 似乎可以正确调用单个值,但是当我尝试在循环中重复调用我的 SearchList 函数时,如下所示:

for (int i = 0; i < attendeeCount; i++) {
    *missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
}

我收到分段错误错误。对我来说,似乎我在做同样的事情,但只是重复调用 SearchList(),但显然有什么问题我没有看到,因为我收到了分段错误错误。有任何想法吗?谢谢。

4

5 回答 5

2

删除 firstMeeting 的前导 '*':

missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
于 2010-02-21T20:24:19.150 回答
1

好的,所以问题如下,您迭代registrants但您的 for 在处理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你应该释放分配的内存。

于 2010-02-21T20:34:32.567 回答
0

好的,您需要将返回值函数放入变量中。我以编写 C++ 为生,我的老板永远不会接受这样的代码。这段代码很难阅读,甚至更难调试。原因是您可以为变量设置监视。当您逐行浏览程序时,您还可以看到程序是如何链接的。调试器将列出名称空间中的所有变量及其对应的值。我敢打赌,当你重写它以使其更具可读性时,你会自己找出问题所在。

于 2010-02-21T20:28:45.383 回答
0

我在您的代码中看到(至少)两个问题。

首先,微不足道但严重的是for循环应该比较 i 与registrantCountnot 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);
  }

指针转换很难阅读。

于 2010-02-21T20:41:13.177 回答
0

问题是尽管计算机一大块可变内存,但这并不是在编程时想象它们的最佳方式。您以这种方式模拟计算机,但效果并不理想。

于 2010-02-21T21:23:45.047 回答