【发布时间】:2012-04-01 18:57:04
【问题描述】:
我对 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;
}
dictElem 和 inputElem 都已被其他方法读取,并且(假设)两个 [0] 元素都是相等的字符串 "aa"。
但是,在我运行 binsearch(inputElem[0] 后,它总是返回 0。我只尝试了 strcmp(dictElem[0],inputElem[0]),它返回 1。
我哪里错了?是比较 char** 和 char* 吗?
统一更新:
加载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);
}
读取用户文件的功能非常相似,只是格式略有不同。
【问题讨论】:
-
尝试在整数数组上运行您的排序函数,如果它工作正常,则转到字符串。
-
你能告诉我们你分配
dictElem和val的代码吗? -
还有,这个算法叫“二叉搜索”,不是“二叉树搜索”,因为没有二叉树,只是一个排序好的数组。
-
你说得对,我错了。
-
我认为
readd正在将换行符读入dictElem数组,所以当然将它与没有换行符的完全相同的字符串进行比较是非常愚蠢的。只是去检查一下
标签: c linux gcc binary-search strcmp