繁体   English   中英

为什么调用bsearch()会导致呈现的程序崩溃?

[英]Why does the call to bsearch() crash the presented program?

我有一个名为“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;
}

尝试给bsearch提供key地址

您将char*作为key参数传递给bsearch,但是您的比较器需要将char**为void *。

一旦你修复了它,下一个问题是bsearch的返回值是指向数组中匹配项的指针。 所以再一个char**而不是char*

要么获得调试器,要么准备好为代码添加大量日志记录。

你的words数组的构造也略有偏差。 因为它完成了工作,但是可能会为每个单词分配缓冲区,而不是在开始时分配所有相同的大小。 谁知道有人会发给你一个文件,里面有80多个字符? 当你可能意味着使用空指针 NULL来终止它时,你终止带有空字符 '/ 0'的单词列表。 '\\ 0'实际上有效,因为它是另一种说0的方式,0转换为空指针。 但这不是你的意思。 并且数组现在不需要以空值终止,因为每次使用它之后都要指定它的长度和size

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM