二进制搜索,strcmp两个动态字符串数组
我对C编程相当陌生,但我会尽力去理解它。我有两个由两个纯文本文件填充的动态字符串。一个是字典的形式,另一个只是用户输入。我想得到的是对字典中每个用户输入的单词进行二进制搜索,并找出它是否存在(我猜是某种拼写检查器) 我被我的二进制搜索功能卡住了:二进制搜索,strcmp两个动态字符串数组,c,linux,gcc,binary-search,strcmp,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
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;
}
读取用户文件的函数非常相似,只是格式稍有不同。您的问题是这一行:
if ((cond=strcmp(dictElem[pos],val) == 0))
括号给出了错误的求值顺序,cond将始终以0或1结尾(因为您将比较结果strcmp()==0分配给它)。请尝试以下方法:
if ((cond=strcmp(dictElem[pos],val)) == 0)
您的问题是这一行:
if ((cond=strcmp(dictElem[pos],val) == 0))
括号给出了错误的求值顺序,cond将始终以0或1结尾(因为您将比较结果strcmp()==0分配给它)。请尝试以下方法:
if ((cond=strcmp(dictElem[pos],val)) == 0)
如果((cond=strcmp(dictElem[pos],val=0)),代码的问题就在这一行
。这行代码将表达式strcmp(dictElem[pos],val)==0
的结果分配给变量cond
,然后检查cond是否为零。
我猜您最初的意图是将strcmp的结果存储在cond
中,因此您应该将右括号移到=
之前。正确的行是if((cond=strcmp(dictElem[pos],val)==0)
您的代码还存在一些其他问题:
char*val
,当
最好使用const char*val
,因为
字符串不会被修改。最好编写常量正确的代码代码的问题在这一行
if((cond=strcmp(dictElem[pos],val)==0))
。这一行代码将表达式strcmp(dictElem[pos],val)==0的结果赋给变量cond
,然后检查cond是否为零。
我猜您最初的意图是将strcmp的结果存储在cond
中,因此您应该将右括号移到=
之前。正确的行是if((cond=strcmp(dictElem[pos],val)==0)
您的代码还存在一些其他问题:
0用作未找到的特殊值,但同时可以
在索引0处找到元素时返回
使用char*val
,当
最好使用const char*val
,因为
字符串不会被修改。最好编写常量正确的代码
尝试在整数数组上运行排序函数,如果它工作正常,请转到字符串。能否向我们显示分配dictElem
和val
的代码?此外,该算法称为“二进制搜索”,而不是“二叉树搜索”,因为没有二叉树,只有一个排序的数组。你完全正确,我的错误。我认为readd
是将换行符读入dictElem
数组,所以当然,将它与没有换行符的完全相同的字符串进行比较是非常愚蠢的。只需检查一下它,在整数数组上运行排序函数呃,如果它工作正常,请转到字符串。您能告诉我们您在哪里分配dictElem
和val
?此外,该算法称为“二进制搜索”,而不是“二叉树搜索”,因为没有二叉树,只有一个排序数组。你完全正确,我的错误。我认为readd
是将换行符读入dictElem
数组,所以当然,将其与没有换行符的完全相同的字符串进行比较是非常愚蠢的。只要检查一下它,就知道答案了!肯定有错误但您建议的更正行保留了if语句条件。尽管Carey Gregory对该行的描述似乎是正确的if((cond=strcmp(dictElem[pos],val))==0)
我还按照您的建议将char更改为常量。尽管函数仍然返回0
,而不管val
如何,但它对我有效(尽管我手动将值关联到dictElem)。我想问题是您没有设置dictSize。如果没有,请检查您的字典是否已排序。因为字典文件应该是可替换的,所以我无法指定数组大小。字典肯定已排序。\n
dictElem
中的字符是否重要?但您不能只在中写入dictSize=size
你的字典加载函数?你肯定需要binsearch()
函数中的dictSize
。至于新客户端,是的,它们确实很重要,你应该手动修剪它,对于一些字符串:s[strlen(s)-1]='\0'
。此外,如果你的字典中的单词(出于某种原因)是长度超过1023个字符。感谢您的回答!括号中肯定有错误。但是您建议的更正行使if语句条件保持打开状态。尽管Carey Gregory在该行if((cond=strcmp(dictElem[pos],val))==0)方面似乎是正确的
我还按照您的建议将char更改为常量。尽管函数仍然返回0
,而不管val
如何,但它对我有效(尽管我手动将值关联到dictElem)。我想问题是您没有设置dictSize。如果没有,请检查您的字典是否已排序。因为字典文件应该是可替换的,所以我无法指定数组大小。字典肯定已排序。\n
dictElem中的字符是否重要?但您不能只在中写入dictSize=size
你的字典