0

我对 C 编程相当陌生,但尽我所能去理解它。我有两个从两个纯文本文件填充的动态字符串。一个是字典的形式,另一个只是用户输入。我想要得到的是对字典中每个用户输入的单词进行二进制搜索,并找出它是否存在(我猜是一种拼写检查器)。

我被困在我的二进制搜索功能上:

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

两者dictEleminputElem都已被其他方法读取,并且(假设)两个 [0] 元素都是相等的字符串"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))。这行代码将表达式的结果赋给strcmp(dictElem[pos], val) == 0变量cond,然后检查 cond 是否为零。我猜你的初衷是存储cond结果strcmp,所以你应该把右括号移到前面==。正确的线是if ((cond = strcmp(dictElem[pos], val) == 0).

您的代码还有其他一些问题:

  1. 0 用作特殊的未找到值,但同时在索引 0 处找到元素时可以返回 0。
  2. 使用char *val, 最好使用const char *val,因为该字符串的内容不会被修改。编写 const 正确的代码总是更好。
于 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 回答