0

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

私は二分探索関数で立ち往生しています:

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

dictElemとの両方inputElemが既に他の方法で読み取られており、(たとえば) 両方の [0] 要素が等しい string"aa"です。

ただし、実行した後はbinsearch(inputElem[0]常に0が返されます。試してみたところstrcmp(dictElem[0],inputElem[0])、1が返されます。

どこが間違っていますか?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);
}

ユーザーファイルを読み取る関数は非常に似ていますが、形式が少し異なります。

4

2 に答える 2

2

コードの問題はこの行にありif ((cond=strcmp(dictElem[pos],val) == 0))ます。このコード行は、expression の結果をstrcmp(dictElem[pos], val) == 0変数condに代入し、cond がゼロかどうかをチェックします。cond本来の意図はの結果に格納することだったと思いますstrcmpので、閉じ括弧を の前に移動する必要があります==。正しい行はif ((cond = strcmp(dictElem[pos], val) == 0).

コードには他にもいくつかの問題があります。

  1. 0 は特別な not-found 値として使用されますが、同時に要素がインデックス 0 で見つかった場合は 0 を返すことができます。
  2. この文字列の内容は変更されないため、を使用char *valした方がよい場合は を使用します。const char *valconst に正確なコードを書くことは常に良いことです。
于 2012-04-01T19:40:31.313 に答える
1

あなたの問題はこの行です:

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

括弧が間違った評価順序を与えており、cond は常に 0 または 1 になります (比較 strcmp() == 0 の結果を割り当てているため)。代わりにこれを試してください:

if ((cond=strcmp(dictElem[pos],val)) == 0)
于 2012-04-01T19:39:54.793 に答える