2012-04-01 88 views
0

我对C编程相当陌生,但尽力了解它。我有两个从两个纯文本文件填充的动态字符串。一种是字典的形式,另一种是用户输入。我想要得到的是二进制搜索词典中的每个用户输入词,并确定它是否存在(我猜想有点拼写检查)。二进制搜索,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"

我运行后,但是它总是返回0。binsearch(inputElem[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); 
} 

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

+0

尝试在整数数组上运行排序函数,如果它能正常工作,则转到字符串。 – 2012-04-01 19:02:41

+0

你能告诉我们代码你在哪里分配'dictElem'和'val'吗? – 2012-04-01 19:04:25

+0

此外,该算法被称为“二进制搜索”,而不是“二进制TREE搜索”,因为没有二叉树,只是一个有序的数组。 – 2012-04-01 20:29:43

回答

2

你的代码问题在这一行if ((cond=strcmp(dictElem[pos],val) == 0))。该行代码将表达式strcmp(dictElem[pos], val) == 0的结果分配给变量cond,然后检查cond是否为零。 我想你的原意是condstrcmp的结果,因此你应该在==之前移动右括号。正确的行是if ((cond = strcmp(dictElem[pos], val) == 0)

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

  1. 0作为特殊的未发现的价值,但在相同的时间0可以 时返回元素在索引0
  2. 被发现使用char *val时, 最好使用const char *val,因为此 字符串的内容不会被修改。编写常量正确的代码总是更好。
+0

感谢您的回答!圆括号肯定有错误。但是,您建议的更正的行会使if语句条件打开。尽管Carey Gregory似乎是对的那一行if((cond = strcmp(dictElem [pos],val))== 0)'我也已经把char改成了常量了,正如你所建议的那样。 – platforma 2012-04-01 20:44:36

+0

虽然函数仍然返回'0',不管'val'我给它。 – platforma 2012-04-01 20:53:11

+0

它适用于我(尽管我手动将值分配给dictElem)。我想问题是你不设置dictSize。如果不是,请检查您的字典是否已排序。 – 2012-04-01 22:11:22

1

你的问题是这样的一行:

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

括号是给它的评价和电导率的错误的顺序将最终总是0或1(因为你分配比较的strcmp的结果() == 0)。试试这个:

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