Функция была проверена, чтобы вернуть значение A, но в основном значение оказалось равным -1 - PullRequest
0 голосов
/ 26 августа 2018

Ошибка, по-видимому, связана с функцией binarySearch и циклом for, в котором она находится. Я поместил несколько printf для проверки значений. двоичный поиск должен возвращать значение: 8, но индексная переменная в цикле for равна -1.

Прошу прощения, если форматирование выглядит ужасно. Пожалуйста, дайте мне руководство о том, как разместить красивый код здесь.

Большое спасибо!

#include <stdio.h>
#include <string.h>

int binarySearch(char[][7], char[], int, int);
void deleteAndMoveEntry(char[][7], int, int);

int main() {
  // all the variables
  const int MAXIMUM = 5000;
  char temp[7];
  char symbol[MAXIMUM][7];
  int sizeSymbol = 0, sizeDeleted = 0;
  char toDelete[MAXIMUM][7];
  int i = 0, j;
  int index;
  FILE *in = fopen("stockin.txt", "r");
  FILE *deleted = fopen("stockdel.txt", "r");
  FILE *out = fopen("stockout.txt", "w");
  FILE *errorFile = fopen("error.txt", "w");

  while (fscanf(in, "%s\n", temp) == 1 && i < MAXIMUM) {
    strcpy(symbol[i], temp);
    i++;
    sizeSymbol++;
  }

  i = 0;

  while (fscanf(deleted, "%s\n", temp) == 1 && i < MAXIMUM) {
    printf("Hi\n");
    strcpy(toDelete[i], temp);
    i++;
    sizeDeleted++;
  }
  // Should we sort array symbol? To implement later for fun

  for (i = 0; i < sizeDeleted; i++) {
    index = binarySearch(symbol, toDelete[i], 0, sizeSymbol);
    printf("%d\n", index);

    if (index != -1) {
      deleteAndMoveEntry(symbol, index, sizeSymbol);
      sizeSymbol--;
    } else if (index == -1)
      fprintf(errorFile, "%s\n", toDelete[i]);
  }

  for (i = 0; i < sizeSymbol; i++)
    fprintf(out, "%s\n", symbol[i]);

  fclose(in);
  fclose(out);
  fclose(deleted);
  fclose(errorFile);
  return 0;
}

int binarySearch(char symbol[][7], char toFind[], int left, int right) {
  if (right >= left) {
    int mid = left + ((right - left) / 2);
    if (strcmp(toFind, symbol[mid]) == 0) {
      printf("%d\n", mid);
      return mid;
    }

    if (strcmp(toFind, symbol[mid]) < 0)
      binarySearch(symbol, toFind, left, mid - 1);

    if (strcmp(toFind, symbol[mid]) > 0)
      binarySearch(symbol, toFind, mid + 1, right);
  }
  return -1;
}

void deleteAndMoveEntry(char symbol[][7], int index, int size) {
  int i;
  for (i = index; i < size - 1; i++) {
    strcpy(symbol[i], symbol[i + 1]);
  }

  strcpy(symbol[i + 1], "");
}

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

относительно: Пожалуйста, дайте мне руководство о том, как разместить здесь красивый код. Один из способов легко очистить форматирование кода - выделить / выделить весь код, а затем нажать {} какэто (в основном) отформатирует ваш код.Затем следуйте аксиоме: только один оператор на строку и (самое большее) одно объявление переменной на оператор.

В C диапазон допустимых значений индекса составляет от 0 до (количество элементовв массиве -1)

Относительно:

for (i = index; i < size - 1; i++) { 
    strcpy(symbol[i], symbol[i + 1]); 

это выражение: symbol[i+1] во время последнего цикла будет иметь доступ за концом массива.

относительно:

strcpy(symbol[i + 1], "");

индекс i будет указывать после последней записи в массиве при выходе из предыдущего цикла for().

Так что это: symbol[i+1] будет иметь доступ к 2 записям за концом массива.

Обе эти проблемы приводят к неопределенному поведению

0 голосов
/ 26 августа 2018

Скорее всего, проблема вызвана отсутствием операторов return в рекурсивных вызовах. Изменить строки

  if (strcmp(toFind, symbol[mid]) < 0)
     binarySearch(symbol, toFind, left, mid - 1);

  if (strcmp(toFind, symbol[mid]) > 0)
     binarySearch(symbol, toFind, mid + 1, right);

до

  if (strcmp(toFind, symbol[mid]) < 0)
     return binarySearch(symbol, toFind, left, mid - 1);

  if (strcmp(toFind, symbol[mid]) > 0)
     return binarySearch(symbol, toFind, mid + 1, right);

Без этих return операторов выполнение падает до нижней части функции, где возвращаемое значение равно -1, что объясняет поведение, которое вы наблюдали в main.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...