Вероятно, одним из самых больших неудобств C является обработка строк. Это все очень низкий уровень. char*
- это не просто строка, которую можно изменить и записать; это просто указатель на память.
Есть несколько способов исправить код, но вот мое рекомендуемое исправление:
// hashes two words and writes the digest to output.
void hashfunc(char* word1, char* word2, char* output) {
//concat both words
char concat[100];
strcpy(concat, word1);
strcat(concat, word2);
MD5_CTX md5;
MD5_Init(&md5);
MD5_Update(&md5,concat,strlen(concat));
MD5_Final(output,&md5);
}
Изменения были:
- Использование временного рабочего буфера для объединения слов в хэши.
- Не возвращает значение, вместо этого он разрешает пользователю передавать буфер для обработки возвращаемого значения.
Преимущество второго изменения заключается в том, что потребитель может использовать память в стеке, а не всегда вынужден иметь дело с распределением памяти внутри функции. (Другой метод заключается в том, чтобы malloc памяти и возвращать ее, которая медленнее и должна быть освобождена вручную).
Также я не совсем уверен, как работает используемая вами библиотека MD5, но вы, вероятно, можете вообще избежать ручной конкатенации:
void hashfunc(char* word1, char* word2, char* output) {
MD5_CTX md5;
MD5_Init(&md5);
MD5_Update(&md5,word1,strlen(word1));
MD5_Update(&md5,word2,strlen(word2));
MD5_Final(output,&md5);
}
А если вам нужен пример использования:
char ret[100];
hashfunc(a, b, ret);