gpt4 book ai didi

c - bsearch() 总是返回空指针

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:04 25 4
gpt4 key购买 nike

我正在尝试在预先排序的数组中查找用户输入的字符串。如果我编写自己的二分查找函数,输入就会被正确找到。如果我使用 C bsearch,我总是得到一个 NULL 指针。

这是相关的代码片段:

printf(bsearch(&input, *words, curr_idx + 1, max_len,
(int (*)(const void *, const void *))strcmp) ?
"YES" : "NO");

char input[max_len]scanf("%s", input) 的结果;大写(输入);

char **words 是预先排序的大写字符串数组

int curr_idxwords的最大索引

int max_lenwords 中单词的最大长度(以字节为单位)(当前为 18)

我已经尝试输入我知道在数组中的字符串,以及我知道不在数组中的字符串,并且每种情况都返回一个 NULL 指针。

在gdb中设置断点并检查inputwords的内容,没有出现任何错误:

(gdb) print (char*)input
$5 = 0x7fffffffe610 "STONE"

(gdb) print words[150980]
$6 = 0x555555bf45a0 "STONE"

编辑添加 MCVE:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char **words;
char *dictionary[5] = { "STOMPS", "STONABLE", "STONE", "STONEBOAT", "STONEBOATS" };
int curr_idx = 4;
int max_len = 18;

int compare(const void *a, const void *b)
{
return strcmp((const char *)a, (const char *)b);
}

void uppercase(char *input)
{
char *t = input;
while (*t) {
*t = toupper((unsigned char)*t);
t++;
}
}

int main()
{
words = malloc((curr_idx + 1) * sizeof(char *));
int i;
for (i = 0; i < 5; i++){
// words[i] = malloc(sizeof(char) * max_len);
words[i] = dictionary[i];
}

char input[max_len];

printf("Enter a word: ");
scanf("%s", input);
uppercase(input);
printf(bsearch(input, words, curr_idx + 1, sizeof(*words), compare) ?
"YES\n" :
"NO\n");
}

malloc() 位是不必要的,但旨在尽可能接近地复制原始程序。

最佳答案

这是您的代码的简化版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void *a, const void *b)
{
return strcmp(a, b);
}

int main(void)
{
const char *words[] = { "A" };
puts(bsearch("A", words, 1, sizeof *words, compare) ?
"YES" :
"NO");
}

问题是 bsearch 调用您的 compare 函数时使用一个指向 当前数组元素的指针(作为第二个参数,即;第一个参数始终是作为第一个参数提供给 bsearch 的键指针。

您的数组元素是指针 (char *),因此 compare 接收到指向 char 的指针。要使 strcmp 工作,您需要取消引用该指针:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void *a, const void *b)
{
const char *const *pstr = b;
return strcmp(a, *pstr);
}

int main(void)
{
const char *words[] = { "A" };
puts(bsearch("A", words, 1, sizeof *words, compare) ?
"YES" :
"NO");
}

关于c - bsearch() 总是返回空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55670716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com