字符串数组的 bsearch() 实现问题

Problem with bsearch() implementation with array of strings

作为编码任务的一部分,我正在尝试实现 bsearch() 的一个版本,但我遇到了字符串数组的问题。

这是我创建的函数:

int binSearch(void *Arr, int Size, int ElemSize,
              void *Item, int (*compare)(void *, void *)) {
    BYTE *pArr = Arr;
    int found = NOT_FOUND;
    int left, right, mid, cmp;
    left = 0, right = (Size - 1);
    while (!found && left <= right) {
        mid = (left + right) / 2;
        cmp = compare(pArr + (mid * ElemSize), Item);
        if (cmp == 0)
            found = FOUND;
        else if (cmp < 0)
            left = mid + 1;
        else
            right = mid - 1;
    }
    return found;
}

此函数似乎在 int *Arr 上运行良好,但在 char **Arr 上运行不佳。函数 returns NOT_FOUND 即使字符串确实在数组中。

这是我创建的调用函数和比较函数:

#define SIZE 100 // max Len for str is 99 chars

int stringBinSearch(char **strings, int size, char *str) {
    return binSearch(strings, size, SIZE, str, compereByAscii);
}

int compereByAscii(char *str1, char *str2) {
    return strcmp(str1, str2);
}

看起来 cmp = compare(pArr + (mid * ElemSize), Item); 有问题,但我想不通。

比较函数获取的是指向数组元素的指针,而不是数组元素本身,因此您必须将代码更改为:

int compareByAscii(void *p1, void *p2) {
    char **strp1 = p1;
    char **strp2 = p2;
    return strcmp(*strp1, *strp2);
}

int stringBinSearch(char **strings, int size, char *str) {
    return binSearch(strings, size, sizeof(char *), &str, compareByAscii);
}

好的,喜欢@n。 1.8e9-其中's-my-share米。在这里的评论中提到,问题出在我的比较函数上,我调用了函数并给了它 char**,但是函数期望 char*.

所以我将比较函数更改为:

int compereByAscii(char** str1, char** str2){
    char* s1 = (char*) *str1;
    char* s2 = (char*) str2;
    return strcmp(s1, s2);
}

现在代码似乎按预期工作了。