#c #function #return #return-value
#c #функция #Возврат #возвращаемое значение
Вопрос:
У меня проблема с возвращаемым значением в двоичном поиске, который я написал.
У меня есть следующее:
int BinarySearch(char *instructions[], int low, int high, char *string);
int main() {
char *instructions[]; // some array of strings - it does not include the string "jk"
char *string = "jk";
int high = inst_len;
int x = binarySearch(instructions, 0, high, string);
if (x == -1)
printf("not found");
else if (x == -2)
printf("error");
else
printf("Found at %d", x);
}
int binarySearch(char *instructions[], int low, int high, char *string) {
int mid = low (high - low) / 2;
// Not found
if (high <= low)
return -1;
// If instructions[mid] is less than string
else if (strcmp(instructions[mid], string) > 0)
binarySearch(instructions, low, mid-1, string);
// If instructions[mid] is larger than string
else if (strcmp(instructions[mid], string) < 0)
binarySearch(instructions, mid 1, high, string);
// Return position
else
return mid;
}
Независимо от того, что, в main
, BinarySearch всегда возвращает 0 . Однако, когда я помещаю операторы печати в алгоритм двоичного поиска, я получаю -1
возврат. Почему это происходит?? Это очень странно!
Ответ №1:
Вы хотите, чтобы это:
// If instructions[mid] is less than string
else if (strcmp(instructions[mid], string) > 0)
return binarySearch(instructions, low, mid-1, string);
// If instructions[mid] is larger than string
else if (strcmp(instructions[mid], string) < 0)
return binarySearch(instructions, mid 1, high, string);
Обратите return
внимание на часть «».
Вы также выполняете сравнение больше раз, чем нужно; вы можете сохранить результат strcmp
, чтобы сделать это только один раз:
int r = strcmp(instructions[mid], string);
if (r > 0)
return binarySearch(instructions, low, mid-1, string);
else if (r < 0)
return binarySearch(instructions, mid 1, high, string);
Комментарии:
1. В качестве отступления: если в вашем компиляторе включены предупреждения, он должен сообщать вам, что эта функция не всегда возвращает значение. Если у вас не включены предупреждения, включите их!
2. @Nayefc — Если вы пропускаете
return
оператор и используете возвращаемое значение, поведение не определено. Обычно возвращаемое значение, которое вы получаете, будет мусором, например. во многих средах x86 это будет просто то, что окажется в регистреeax
.