2012-05-26 4 views
1

Я пытаюсь преобразовать строку в unsigned char *. И я работал в кругах. Моя программа запрашивает у пользователя последнее имя, которое я принимаю как строку. Затем я добавляю строку в целое число, используя djb2. который принимает unsigned char * в качестве параметра. Цель моей программы - создать хеш-таблицу, используя цепочку для обработки конфликтов.преобразовать строку в unsigned 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; 
} 

Im получаю сообщение об ошибке с выше говорил мне, что «Аргумент типа„символ *“несовместима с параметром типа„неподписанные символ *“. Любая помощь очень ценится

+1

Прослушайте компилятором. В 'insert' вы используете' char * '. Ваша функция 'dbj2' принимает' unsigned char * '. Это разные типы. Почему бы не изменить 'dbj2' на' const string & 'и изменить' dbj2' для работы с строками? –

+0

Или, альтернативно, вы можете изменить 'djb2', чтобы принимать аргументы типа' const char * '. Так как ваша хеш-функция не на самом деле * не изменяет * вход, вам лучше с аргументом 'const'. – Gnosophilon

ответ

4

Если у вас есть набор текста такие вопросы, как это, это хороший признак того, что вы не используете язык наилучшим образом Отправляясь туда и обратно между строками и полукоксом * с в C++ является 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 затем отливали cstr к unsigned char * в dbjc вызова:

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 
} 
Смежные вопросы