簡體   English   中英

檢查函數以返回值A,但在主函數中,該值被發現為-1

[英]Function was checked to return value A, but in main, the value was found to be -1

該錯誤似乎在binarySearch函數中,並且存在於for循環中。我放置了一些printf來檢查值。 binarySearch應該返回值: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], "");
}

該問題很可能是由於遞歸調用中缺少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觀察到的行為。

關於: 請給我有關如何在此處發布漂亮代碼的指南。 輕松清理代碼格式的一種方法是突出顯示/選擇所有代碼,然后單擊{}因為這將(大部分)格式化代碼。 然后遵循公理: 每行僅一個語句,並且(最多)每個語句一個變量聲明。

在C中,有效索引值的范圍是從0到((數組-1中的元素數))

關於:

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

此表達式: symbol[i+1]在最后一個循環中將訪問數組的末尾。

關於:

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

當前面的for()循環退出時,索引i將指向數組的最后一個條目。

因此: symbol[i+1]將訪問數組末尾之外的2個條目。

這兩個問題都導致不確定的行為

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM