我有一个名为“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;
}
答案 0 :(得分:2)
尝试提供bsearch
key
的地址。
答案 1 :(得分:2)
为什么会这样?
您将char*
作为key
参数传递给bsearch,但您的比较器需要将char**
转换为void *。
一旦你修复了它,下一个问题是bsearch的返回值是指向数组中匹配项的指针。再次char**
而不是char*
。
非常感谢任何建议。
要么获得调试器,要么准备好为代码添加大量日志记录。
同样,words
数组的构造略有偏差。因为它完成了工作,但是可能会为每个单词分配缓冲区,而不是在开始时分配所有相同的大小。谁知道有人会发给你一个文件,里面有80多个字符?使用nul 字符,'\ 0'终止单词列表时,可能意味着使用null 指针,NULL来终止它。 '\ 0'实际上有效,因为它是另一种说0的方式,0转换为空指针。但这不是你的意思。现在,数组不需要以空值终止,因为每次使用它都会指定其长度size
。