Почему бы вам не объявить
char filename[SHA_DIGEST_LEN*2 +1];
/ * И +1, если вы хотите иметь завершающий символ NULL * /
Это потому, что длина дайджеста SHA1 составляет 20 байтов. Если вы просто печатали дайджест, то, возможно, вам не нужна дополнительная память, но, поскольку вы хотите шестнадцатеричную строку дайджеста, вы можете использовать вышеуказанное объявление.
Операция strlen возвращает длину строки до тех пор, пока не встретится нулевой завершающий символ.
Так что в основном, когда вы делаете следующее:
sprintf(filename + strlen(filename),"%02x",result[j]);
В первом случае имя файла копируется с 2 байтами шестнадцатеричного представления первого байта дайджеста sha-1. Например. Скажем, это AA, теперь вам нужно переместить указатель на два места, чтобы скопировать следующий байт.
После второй итерации он становится AABB.
После 20-й итерации у вас есть вся строка AABBCC ...... AA [40 байт] и +1, если вам нужен '\ 0', который является символом завершения NULL.