我尝试在djb2哈希函数中添加功能,但它似乎并不喜欢这些更改。具体来说,我试图包含一个将单词(字符串)转换为小写的循环。它抛出以下两个错误:
char *
int
的指针转换不兼容
char *[45]
请注意,原始代码*str++
出现在while
循环中。这是我的第一个哈希表,我对指针很不稳定。任何洞察我出错的地方都将不胜感激。
// djb2 by Dan Bernstein -- slightly modified;
unsigned int hash_function(const char* str)
{
unsigned int hash = 5381;
int c;
char* string[45];
for (int i = 0; str[i] != '\0'; i++)
{
string[i] = (tolower(str[i]));
}
while (c == *string++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return (hash % LISTS);
}
答案 0 :(得分:1)
此:
char* string[45];
表示&#34; 45个字符指针的数组&#34;,你应该删掉星号。
并且您无法通过递增变量来迭代数组,因此无法更改数组变量。您可以使用单独的指针:
const char *s = string;
while (c = *s++)
请注意,作业拼写为=
,而==
则是对等的比较,这不是您的意思。
答案 1 :(得分:1)
更高效的哈希版本:
unsigned int hash_function(const char* str)
{
unsigned int hash = 5381, c;
while(c = *str++)
hash += (hash << 5) + (c | 040);
return (hash % LISTS);
}