[英]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.