我对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。我试了一下,结果是1。
我哪里做错了?比较char**和char*?
升级版:
加载strcmp(dictElem[0],inputElem[0])的函数
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);
}

读取用户文件的函数非常相似,只是格式有点不同。

最佳答案

代码的问题就在这一行。这一行代码将表达式的结果赋给变量,然后检查cond是否为零。
我猜你的初衷是把if ((cond=strcmp(dictElem[pos],val) == 0))的结果存储在strcmp(dictElem[pos], val) == 0中,所以你应该在cond之前移动右括号。正确的行是cond
您的代码还有一些其他问题:
0用作特殊的未找到值,但同时0可以
在索引0处找到元素时返回。
使用strcmp,当
最好使用==,因为
字符串不会被修改。最好是编写常量正确的代码。

关于c - 二进制搜索,strcmp C中两个字符串的动态数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9967281/

10-13 08:13