二进制搜索,strcmp C中的两个动态字符串数组

时间:2012-04-01 18:57:04

标签: c linux gcc binary-search strcmp

我对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);
}

读取用户文件的功能非常相似,只是格式不同。

2 个答案:

答案 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可以 在索引0处找到元素时返回。
  2. 使用char *val,何时 最好使用const char *val,因为这个内容 字符串不会被修改。编写const-correct代码总是更好。

答案 1 :(得分:1)

你的问题就在这一行:

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

括号正在给出错误的评估顺序,cond总是会以0或1结尾(因为你要将比较结果strcmp()== 0赋给它)。试试这个:

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