Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二进制搜索,strcmp两个动态字符串数组_C_Linux_Gcc_Binary Search_Strcmp - Fatal编程技术网

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

二进制搜索,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

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

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

您的问题是这一行:

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)

您的代码还存在一些其他问题:

  • 0用作未找到的特殊值,但同时可以 在索引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
    你的字典