1

我有一个名为“dict.txt”的未排序字典文件。我已经设法将文件中的单词放在一个数组中,并且我使用的 qsort() 似乎也可以正常工作(也就是说,数组已排序)。

当我调用 bsearch() 时出现问题,程序崩溃,我的问题是:

为什么会这样?

我使用 gcc 进行编译并且不使用任何类型的 IDE,因此我没有任何调试器,也不知道如何使用(还)。

我很清楚这里提供的代码可能包含几个问题。

那是因为我对 c 很陌生,而且我的背景主要是 Java(尽管有相似之处,这似乎是一个缺点,因为我已经习惯了 OO 而 c 显然不是 OO)。

任何建议将不胜感激。

int strcmp_mod(const void *p1, const void *p2) {
   return strcmp(* (char * const *) p1, * (char * const *) p2);
}

int main(void) {

int size, i;
char **words;

char *pItem;
char *key = "fight";

char* buf = load_file("dict.txt"); if (buf == NULL) return 1;

size = count_words(buf);

words = (char**)malloc((size+1) * sizeof(char*));

for (i=0; i<size; i++) {
    words[i] = (char*)malloc(80 * sizeof(char));
}   

copy_words_to_lower(buf, words, size);
    words[size] = '\0';

    qsort(words, size, sizeof(char*), strcmp_mod);

for (i=0; i<size; i++) {
    printf("%s\n", words[i]);
}  

pItem = (char *) bsearch(key, words, size, sizeof(char*), strcmp_mod);

if (pItem!=NULL)
    printf ("%s is in the array.\n", pItem);
else
    printf ("%s is not in the array.\n", key); 

return 0;
}
4

2 回答 2

2

尝试给出bsearch地址key

于 2009-11-28T20:07:46.163 回答
2

为什么会这样?

您将 achar*作为key参数传递给 bsearch,但您的比较器期望将 achar**转换为 void* 的结果。

一旦你解决了这个问题,下一个问题是 bsearch 的返回值是一个指向数组中匹配项的指针。所以又是 achar**不是 a char*

任何建议将不胜感激。

要么得到一个调试器,要么准备好在你的代码中添加大量的日志记录。

您的阵列的构造words也略有偏差。因为它完成了工作,但在你去的时候为每个单词分配缓冲区可能是一个想法,而不是在开始时都分配相同的大小。谁知道是否有人会向您发送一个包含 80 多个字符长的单词的文件?当您可能打算使用空指针NULL终止单词列表时,您可以使用空字符'\0' 终止单词列表。'\0' 实际上有效,因为它是 0 的另一种说法,并且 0 转换为空指针。但这不是你的意思。并且该数组现在根本不需要以空值结尾,因为之后每次使用它时都指定它的长度,.size

于 2009-11-28T20:11:13.413 回答