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

标签 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*吗?

更新: 加载 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);
}

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

最佳答案

您的代码的问题在于此行 if ((cond=strcmp(dictElem[pos],val) == 0))。这行代码将表达式 strcmp(dictElem[pos], val) == 0 的结果赋值给变量 cond,然后检查 cond 是否为零。 我猜您的初衷是将 strcmp 的结果存储在 cond 中,因此您应该将右括号移到 == 之前。正确的行是 if ((cond = strcmp(dictElem[pos], val) == 0)

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

  1. 0 用作特殊的未找到值,但同时 0 可以是 当在索引 0 处找到元素时返回。
  2. 使用 char *val,当 最好使用 const char *val,因为这个的内容 字符串不会被修改。编写 const 正确的代码总是更好。

关于c - 二进制搜索,strcmp C 中的两个动态字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9967281/

相关文章:

c - 在不同级别使用不同的枚举类型

当 .exe 在 Windows 7 32 位上运行时,使用 GCC 编译的 C 程序会导致 NVTDM 错误

c - 在错误的线程中调用信号处理程序

linux - 使用 OpenGL 3+ 进行远程 X11 转发

c - 在 C 中释放内存时出现段错误

linux - system() 调用的 WiringPi gpio 必须使用另一个进程?

linux - 如何定位最大的目录

gcc - gcc 链接器如何获取函数的大小?

ISO 8601 :2004 中的 C 预处理器 __TIMESTAMP__

c - 尝试通过指针返回 char 数组,但给出了不正确的结果