Почему вызов bsearch () приводит к сбою представленной программы? - PullRequest
1 голос
/ 28 ноября 2009

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

Ответы [ 2 ]

2 голосов
/ 28 ноября 2009

Почему это происходит?

Вы передаете char* в качестве параметра key в bsearch, но ваш компаратор ожидает, что char** приведет к аннулированию *.

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

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

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

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

2 голосов
/ 28 ноября 2009

Попробуйте указать bsearch адрес из key.

...