Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么对bsearch()的调用会使呈现的程序崩溃?_C_Sorting_Debugging_Bsearch - Fatal编程技术网

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

为什么对bsearch()的调用会使呈现的程序崩溃?,c,sorting,debugging,bsearch,C,Sorting,Debugging,Bsearch,我有一个未排序的字典文件名为“dict.txt”。 我已经成功地将文件中的单词放入了一个数组中,我使用的qsort()似乎也工作得很好(也就是说,数组已排序) 调用bsearch()时会出现问题, 程序崩溃了,我的问题是: 为什么会这样 我使用gcc进行编译,不使用任何类型的IDE,因此我没有任何调试器,也不知道如何使用 我很清楚这里的代码可能包含几个问题 这是因为我对c非常陌生,我的背景主要是Java(尽管有相似之处,但这似乎是一个缺点,因为我非常习惯OO,而c显然不是OO) 如有任何建议,将

我有一个未排序的字典文件名为“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;
}
int strcmp\u mod(常数无效*p1,常数无效*p2){
返回strcmp(*(字符*常量*)p1,*(字符*常量*)p2);
}
内部主(空){
int大小,i;
字符**字;
char*pItem;
char*key=“战斗”;
char*buf=load_文件(“dict.txt”);if(buf==NULL)返回1;
大小=字数(buf);
words=(char**)malloc((size+1)*sizeof(char*);

对于(i=0;i尝试给出
b搜索
键的地址
尝试给出
b搜索
键的地址
为什么会发生这种情况

您正在将
char*
作为
参数传递给bsearch,但您的比较器预期将
char**
强制转换的结果作废*

一旦您解决了这个问题,下一个问题是来自bsearch的返回值是指向数组中匹配项的指针

如有任何建议,将不胜感激

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;
}
要么获得一个调试器,要么准备向代码中添加大量日志记录

另外,
单词
数组的构造也有点不对劲。按原样可以完成任务,但最好是在开始时为每个单词分配缓冲区,而不是一开始就分配相同的大小。谁知道是否有人会向您发送一个单词长度超过80个字符的文件?您可以使用nu来终止单词列表l字符'\0',当您可能想用空指针终止它时,null。'\0'实际上是有效的,因为它是表示0的另一种方式,0转换为空指针。但这不是您的意思。数组现在根本不需要以空结尾,因为每次使用它之后,您都要指定它的长度,
size

为什么会发生这种情况

您正在将
char*
作为
参数传递给bsearch,但您的比较器预期将
char**
强制转换的结果作废*

一旦您解决了这个问题,下一个问题是来自bsearch的返回值是指向数组中匹配项的指针

如有任何建议,将不胜感激

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;
}
要么获得一个调试器,要么准备向代码中添加大量日志记录


另外,
单词
数组的构造也有点不对劲。按原样可以完成任务,但最好是在开始时为每个单词分配缓冲区,而不是一开始就分配相同的大小。谁知道是否有人会向您发送一个单词长度超过80个字符的文件?您可以使用nu来终止单词列表l字符'\0',当您可能想用空指针终止它时,null。'\0'实际上是有效的,因为它是表示0的另一种方式,0转换为空指针。但这不是您的意思。数组现在根本不需要以空结尾,因为每次使用它之后,您都要指定它的长度,
size

尝试在strcmp\u mod函数中放入printf(),这样可以让您准确地看到所比较的内容(以及它是否是有效字符串),因此即使没有调试器,您也可以准确地看到正在进行的操作。尝试放入printf()在strcmp_mod函数中…这将让您确切地看到所比较的内容(以及它是否是有效字符串),因此即使没有调试器,您也可以确切地看到正在发生的事情。回答得很好。我有一个关于如何分配缓冲区的问题。当我尝试在copy_words_to_lower()中使用相同的语法时在检查了当前单词的长度后,我在使用malloc()时也被抛出我得到了一个错误,它与访问某个不允许的内存地址有关。这就是为什么我最初将它放在外部,因为它似乎是这样工作的。关于这个问题有什么好的建议吗?另一个选择是根本不为每个字分配缓冲区。你不使用它做任何其他事情,所以你可以dify
buf
中的数据。在每个单词的末尾写一个NUL字节(我猜目前单词之间有空格或换行符?),将所有大写字母替换为小写字母,并将指向每个单词开头的指针写入
单词
数组。来自Java,这可能有点老套,只是将一个大字符串转换为许多小字符串,但在实际的C代码中,避免过多的内存分配通常是一个需要考虑的问题。我会尝试一下。实际上,我喜欢我不喜欢Java的一个地方是它有点重,一般来说没有太多关于优化的考虑。回答得很好。我有一个关于如何分配缓冲区的问题。当我尝试在copy_words_to_lower()中使用相同的语法时在检查了当前单词的长度后,我在使用malloc()时也被抛出我得到了一个错误,它与访问某个不允许的内存地址有关。这就是为什么我最初将它放在外部,因为它似乎是这样工作的。关于这个问题有什么好的建议吗?另一个选择是根本不为每个字分配缓冲区。你不使用它做任何其他事情,是吗