字符串数组的 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);
}
现在代码似乎按预期工作了。
作为编码任务的一部分,我正在尝试实现 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);
}
现在代码似乎按预期工作了。