2011-10-04 65 views
2

我在编写的二进制搜索中返回值存在问题。在C中返回值

我有以下:

INT的binarySearch(字符*指令[],INT低,INT高,字符*串);

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。这是为什么发生?这很奇怪!

回答

5

你想这样的:

// 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); 
+3

顺便说一句:如果你在你的编译器打开了警告,它应该告诉你,这个函数并不总是返回值。如果您没有启用警告,请将其打开! – duskwuff

+0

哦!我多么愚蠢。那为什么'x'总是分配0? – darksky

+2

@Nayefc - 如果你缺少一个'return'语句并且你使用了返回值,那么这个行为是不确定的。通常你得到的返回值是垃圾,例如。在很多x86环境下,它只会发生在寄存器'eax'中。 – asveikau