【问题标题】:Trouble debugging binarysearch function in C在 C 中调试二进制搜索函数时遇到问题
【发布时间】:2017-12-06 11:27:00
【问题描述】:

我正在尝试进行二进制搜索,以搜索有序的数字文件。虽然,即使在我将其转换为函数之前它在“main”中工作,但在我的 fseek() 之后它已经成功地产生了一些奇怪的行为。

有什么建议吗?

int BinarySearch(FILE *cp, char *CPR, int *position) {

  int i, lines, current_line;
  double CPR_number, CPR_check;
  char CPR_check_string[CPR_LEN];

  sscanf(CPR, "%lf", &CPR_number);

  fseek(cp, 0L, SEEK_END);
  lines = ftell(cp)/12;

  current_line = ftell(cp)/2 - ((ftell(cp)/2) % 12);

  for (i = 0; i < log10(lines)/log10(2); i++) {

    fseek(cp, current_line, SEEK_SET);

    /* Read CPR as string */
    fscanf(cp, "%[0-9]", CPR_check_string);

    /* Convert to number */
    sscanf(CPR_check_string, "%lf", &CPR_check);

    if (CPR_number == CPR_check) {
      printf("This happens\n");
      *position = ftell(cp);
      return TRUE;
    } else if (CPR_number < CPR_check) {
      current_line = ftell(cp)/2 - ((ftell(cp)/2) % 12);
    } else if (CPR_number > CPR_check) {
      current_line = ftell(cp) + ftell(cp)/2 - ((ftell(cp) + ftell(cp)/2) % 12);
    }
  }

  return FALSE;
}

它似乎没有运行其余的代码。

提前致谢。

【问题讨论】:

  • 你能详细说明一下“奇怪的行为”吗?发生什么了?对于某些特定输入,预期和实际输出是多少?你怎么称呼这个函数?文件的内容是什么?文件是以二进制还是文本模式打开的?当您将位置除以 12 时,您是否正确计算换行符?请read about how to ask good questions,并学习如何创建Minimal, Complete, and Verifiable Example
  • 我试过 printf("test\n");在第一次 fseek 之前它工作了,但在它之后,它什么也不打印。我将函数称为:“if(BinarySearch(cp, CPR, &position))。该文件包含 9 行 10 位数字 + 换行符,即 12 字节 pr。行。这说明了吗?

标签: c file fseek


【解决方案1】:

我找到了答案,是我的 FILE 指针关闭,它必须是指向 FILE ** 的指针的指针。

【讨论】:

  • 这显然不是实际的解决方案 - fseek 等... 使用 FILE * 如果您将其传递给 FILE **,您的编译器应该会抱怨很多。在您的代码中其他地方可能存在一些未定义的行为,此解决方案纯属偶然。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 2021-09-18
  • 2017-09-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多