Почему вызов bsearch () приводит к сбою представленной программы?

StackOverflow https://stackoverflow.com/questions/1813617

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня есть несортированный файл словаря с именем " 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 ** аннулировать *.

Как только вы это исправите, следующая проблема заключается в том, что возвращаемое значение из bsearch является указателем на соответствующий элемент в массиве. Итак, снова char ** , а не char * .

Любой совет будет принята с благодарностью.

Либо получите отладчик, либо приготовьтесь добавить множество записей в ваш код.

Кроме того, конструкция вашего массива words немного отключена. Как бы то ни было, он выполняет свою работу, но это может быть идея выделить буфер для каждого слова по ходу, а не все одинакового размера в начале. Кто знает, отправит ли вам файл со словом длиной более 80 символов? Вы заканчиваете список слов нулевым символом , '\ 0', когда вы, вероятно, хотите завершить его нулевым указателем , NULL. '\ 0' на самом деле работает, потому что это еще один способ сказать 0, а 0 преобразуется в нулевой указатель. Но это не то, что вы имеете в виду. И массив не должен заканчиваться нулем вообще прямо сейчас, потому что каждый раз, когда вы используете его после этого, вы указываете его длину, size .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top