我正在用C实现一个代码,以便将字符串复制到一个字符数组(字符串(中,然后对其进行bsearch。但出乎意料的是,对于应该为true的结果,bsearch返回false。我猜这与我在插入过程中如何首先插入字符串有关。您可以将其视为在btree的叶节点上进行插入和搜索。
我在一个多文件的框架中编码,所以不能发布所有的代码。张贴相关部件
字符串数组的结构更易于可视化-
array of strings ( array of array of chars )
--
0 -- array of characters ( size may be 5 )
1 -- array of characters ( size may be 7 )
2 -- array of characters ( size may be 10 )
or
keys = [
[ s t r i n g 1 ]
[ s t r i n g T w o ]
[ s t r i n g T H R E E ]
]
要插入的函数-
void insert_in_leaf_node(struct leaf_node * node, u32 len, u8 * key){
if (node->no_of_keys > 1 ) {
if (!search_in_fat(node, len, key)) {
node->keys[node->no_of_keys] = (char *) malloc(sizeof(char) * len);
strncpy(node->keys[node->no_of_keys], (char *) key, len); // copy key to array
node->keys[node->no_of_keys][len] = ' ';
node->no_of_keys += 1;
qsort(node->keys, (size_t) node->no_of_keys, sizeof(char *), cstring_cmp); // sort alphabetically to enable bsearch later
}
} else {
node->keys[node->no_of_keys] = (char *) malloc(sizeof(char) * len);
strncpy(node->keys[node->no_of_keys], (char *) key, len); // copy key to array
node->keys[node->no_of_keys][len] = ' ';
node->no_of_keys += 1;
qsort(node->keys, (size_t) node->no_of_keys, sizeof(char *), cstring_cmp); // sort alphabetically to enable bsearch later
}
}
要搜索的代码-
bool search_in_fat(struct leaf_node * node, u32 len, u8 * key){
if(!bsearch(key,node->keys,(size_t)node->no_of_keys, sizeof( char * ),(int(*)(const void*,const void*)) strcmp)) return false;
return true;
}
插入函数-中使用的cstring_cmp函数
int cstring_cmp(const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcmp(*ia, *ib);
/* strcmp functions works exactly as expected from
comparison function */
}
如果有人想知道密钥中有什么,下面是如何提前填充密钥数组,并且每次都用单独的密钥调用set/get函数(set/get功能调用上述函数(
用于从文件中跟踪加载以生成密钥数组的代码-(__samples持有密钥(
bool
load_trace(const char * const filename)
{
char * buf = NULL;
size_t size = 0;
FILE * fin = fopen(filename, "r");
if (fin == NULL) return false;
u64 i = 0;
// count for lines
while (getline(&buf, &size, fin) >= 1) {
i++;
}
rewind(fin);
__samples = malloc(sizeof(char *) * i);
__sizes = malloc(sizeof(u32) * i);
__nr_samples = i;
ssize_t len = 0;
i = 0;
while ((len = getline(&buf, &size, fin)) >= 1) {
if (buf[len-1] == 'n') { // remove trailing 'n'
len--;
buf[len] = ' ';
}
__samples[i] = strdup(buf);
__sizes[i] = len;
i++;
}
free(buf);
fclose(fin);
return true;
}
p.S:这部分不是我编码的,而是我的学长在构建框架时编码的。
可能是什么问题?我已经做了很多谷歌搜索,但还没有积极的结果。
谢谢!
不能将strcmp()
作为bsearch()
的比较函数传递。该函数需要使用指向元素的指针进行比较(在这种情况下,指向字符串指针的指针,尽管函数参数的实际类型需要为const void *
(,而strcmp()
需要指向字符串的指针。它无法处理额外的间接层。
您没有显示函数,但可能可以使用与qsort()
一起使用的cstring_cmp()
函数。
bsearch()
比较函数的第一个自变量是作为关键字给出的指针,第二个自变量是指向被比较数组的当前元素的指针,其中对于qsort()
比较函数,两个自变量都是指向元素的指针。因此,如果您将bsearch()
的关键参数设置为指向您要查找的对象的指针,那么两者都将使用相同的函数。换句话说,bsearch(&key, ...)
是好的,bsearch(key, ...)
不是。您还可以有一个特定于bsearch()
的比较函数来处理第二种情况。看见https://stackoverflow.com/a/15824981/9952196例如。