2012-04-01 15 views
0

私はCプログラミングにはかなり新しいですが、それを理解するために全力を尽くしています。私は2つのプレーンテキストファイルから読み込まれた2つの動的文字列を持っています。 1つは辞書の形式であり、もう1つはユーザー入力です。私が得たいのは、辞書内の各ユーザ入力単語をバイナリ検索し、それが存在するかどうかを調べることです(推測するスペルチェッカーの一種)。バイナリ検索、strcmp 2つのC言語の文字列の動的配列

両方 dictEleminputElem
char **dictElem; 
int dictSize; 
char **inputElem; 

int binsearch(const char *val){ 
    int pos; 
    int beg=0; 
    int end=dictSize-1; 
    int cond=0; 

    while (beg<=end){ 
    pos=(beg+end)/2; //Jump in the middle 
    if ((cond=strcmp(dictElem[pos],val)) == 0) 
     return pos; 
    else if (cond<0) 
     beg=pos+1; 
    else 
     end=pos-1; 
    } 
    return 0; 
} 

がすでに他の方法で読み取られたとの両方の[0]要素が等しい文字列"aa"がある(のは言わせて):

は、私は私のバイナリ検索機能にこだわっています。

私はbinsearch(inputElem[0]を実行した後、しかし、それは常に私がちょうどstrcmp(dictElem[0],inputElem[0])を試してみました、それは私が間違っているつもりです。1.

を返します0を返しますか?それはchar **とchar *を比較していますか?

UPD:ユーザーファイルを読み込むdictElem

void readd(FILE *file){ 
    int i=0,size=0; /* local size */ 
    char line[1024]; /* Local array for a single word read */ 
    printf("Loadingn dict...\n"); 
    while ((fgets(line,sizeof(line),file))!=NULL){ 
    dictElem=(char**)realloc(dictElem,(size+1)*sizeof(char *)); 
    dictElem[size++]=strdup(line); 
    } 
    printf("Total elements loaded: %d\n",size); 
} 

機能をロードしています 機能はほんの少し異なるフォーマット、非常によく似ています。

+0

文字列に正しく移動する場合、整数の配列に対してソート関数を実行してみてください。 –

+0

'dictElem'と' val'をどこに割り当てているのかわかりますか? –

+0

また、バイナリツリーがないため、ソートされた配列なので、このアルゴリズムは "バイナリ検索"ではなく "バイナリ検索"と呼ばれます。 –

答えて

2

あなたのコードに問題がこのラインif ((cond=strcmp(dictElem[pos],val) == 0))です。このコード行は、式strcmp(dictElem[pos], val) == 0の結果を変数condに代入し、condがゼロかどうかを確認します。 私は元の意図がcondの結果をstrcmpに保存していたと思いますので、閉じ括弧を==の前に移動する必要があります。正しい行はif ((cond = strcmp(dictElem[pos], val) == 0)です。

あなたのコードといくつかの他の問題があります。

  1. 0は特別見つからない値として使用されているが、要素がインデックス0
  2. で発見されたときに同時に0に を返すことができますが、 char *valを使用すると、 の場合はを使用する方がよいでしょう。この 文字列の内容は変更されないためです。 const正しいコードを書く方が良いです。
+0

答えをありがとう!間違いなく括弧に誤りがあります。しかし、あなたが提案した修正された行はif文の条件を開いたままにします。 Carey Gregoryはこの行について正しいようですが、 'if((cond = strcmp(dictElem [pos]、val))== 0)'あなたが提案したようにcharを一定に変更しました。 – platforma

+0

関数は 'val'にかかわらず' 0'を返すが、私はそれを与える。 – platforma

+0

それは私のために働く(私は手動でdictElemに値をアサインしたが)。私は問題はあなたがdictSizeを設定しないことだと思います。そうでない場合は、辞書がソートされているかどうかを確認してください。 –

1

あなたの問題は、この行です:括弧はそれを常に終わるだろうな評価と指揮の誤った順序を与えている

if ((cond=strcmp(dictElem[pos],val) == 0)) 

0または1(あなたは比較にstrcmpの結果を代入しているので、() == 0それに)。代わりにこれを試してみてください:

if ((cond=strcmp(dictElem[pos],val)) == 0) 
関連する問題