2012-05-26 70 views
1

我想将字符串转换为无符号字符*。我一直在圈子里跑。我的程序提示用户输入一个字符串的姓。然后我使用djb2将字符串散列为一个整数。它将一个无符号的char *作为参数。我的程序的目标是使用链接创建一个哈希表来处理碰撞。将字符串转换为无符号字符str

unsigned long djb2(unsigned char *str) 
{ 
    unsigned long hash = 5381; 
    int c; 

    while (c = *str++) 
     hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 

    return hash; 
} 

我的代码如下大气压。

void insert(LinkedList<Person>* HashList1[], LinkedList<Person>* HashList2[], int listSize) 
{ 
    char * cstr; 
    string str; 
    cin >> str; 
    cstr = new char [str.size()+1]; 
    strcpy (cstr, str.c_str()); 
    int hashBucket1 = djb2(cstr) % listSize; 
} 

即时得到与上面告诉我的char *“的类型参数‘’是类型的参数不兼容的‘无符号字符*’的错误。任何帮助是极大的赞赏

+1

听编译器。在'insert'中你使用'char *'。你的'dbj2'函数需要一个'unsigned char *'。这些是不同的类型。为什么不改变'dbj2'来使用'const string&'并修改'dbj2'来对字符串进行操作? –

+0

或者,您也可以将'djb2'改为接受'const char *'类型的参数。由于你的散列函数实际上并没有修改输入,所以你最好使用'const'参数。 – Gnosophilon

回答

4

当你有打字类似这样的问题,那就是你不使用的语言最好的方式一个很好的迹象来回在C字符串与char * S之间++是一个bad code smell

修改dbjc使用的字符串:。

unsigned long djb2(const string& str) 
{ 
    unsigned long hash = 5381; 

    for(string::iterator it=str.begin();it!=str.end();it++) 
     hash = ((hash << 5) + hash) + *it; /* hash * 33 + character */ 

    return hash; 
} 

这将大大简化您的插入:

void insert(LinkedList<Person>* HashList1[], LinkedList<Person>* HashList2[], int listSize){ 
    string str; 
    cin >> str; 
    int hashBucket1; 
    hashBucket1 = djb2(str) % listSize; 
} 
+0

我试图避免修改djb2,因为它是通过我们的老师提供给我们的功能。我想我会问她是否可以更改散列函数djb2。 – Jeremy

0

最好的解决办法是修改dbjc功能,通过@Steven Burnap任的建议。

如果你不能改变dbjc然后在dbjc调用转换cstrunsigned char *

void insert(LinkedList<Person>* HashList1[], LinkedList<Person>* HashList2[], int listSize){ 
     char * cstr; 
     string str; 
     cin >> str; 
     cstr = new char [str.size()+1]; 
     strcpy (cstr, str.c_str()); 
     int hashBucket1; 
     hashBucket1 = djb2((unsigned char *)cstr) % listSize; // <-- here is the change 
}