1

「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;
}
4

2 に答える 2

2

bsearchアドレスを指定してみてくださいkey

于 2009-11-28T20:07:46.163 に答える
2

なぜこうなった?

achar*keyパラメータとして bsearch に渡していますが、コンパレータは achar**を void* にキャストした結果を期待しています。

それを修正したら、次の問題は、bsearch からの戻り値が配列内の一致する項目へのポインターであることです。繰り返しますが、でchar**はありませんchar*

アドバイスをいただければ幸いです。

デバッガーを入手するか、コードに大量のログを追加する準備をしてください。

また、words配列の構成がわずかにずれています。そのままで作業は完了しますが、最初はすべて同じサイズにするのではなく、単語ごとにバッファーを割り当てることをお勧めします。誰かが 80 文字を超える単語を含むファイルを送信するかどうかは誰にもわかりません。単語のリストをヌル文字'\0' で終了するのは、おそらくヌルポインターNULL で終了することを意図しているからです。'\0' は 0 の別の言い方であり、0 は null ポインターに変換されるため、実際には機能します。しかし、それはあなたが意味するものではありません。また、配列を使用するたびにその長さsize.

于 2009-11-28T20:11:13.413 に答える