Вы должны увеличить unsigned char tmp[2]
до unsigned char tmp[3]
и unsigned char hash[8][32]
до unsigned char hash[8][33];
Одной из проблем является sprintf(tmp,"%2.2x",hashResults[k][i])
, потому что он записывает два символа + '\ 0', которые занимают три элемента в массиве tmp
.
Но самая большая проблема - strcat(hash[k],tmp);
.
В конце каждого внутреннего цикла for вы записали в хэш-массивы [k] 33 символа (32 символа + '\ 0'). Когда вы заполняете один из hash[k]
массивов во внутреннем цикле for, вы также записываете \0'
в первый элемент следующего массива, поэтому printf("%d \n%s\n", strlen(hash[k]), hash[k]);
выводит правильные результаты. Это вводит вас в заблуждение, полагая, что вы обнулили массивы hash[k]
. Теперь, когда вы вводите следующий внутренний цикл for, вы перезаписываете ноль, записанный в этот массив при предыдущем выходе из внутреннего цикла for, больше не завершая предыдущий массив.
Таким образом, вы завершаете нулевой массив hash[k]
, записывая ноль в первый элемент массива hash[k+1]
на выходе внутреннего цикла for. Затем вы переопределяете это нулевое значение каждый раз, когда вводите внутренний цикл for.
В конце концов, у вас нет завершающих нулей в ваших массивах, и есть только последний нулевой в последнем массиве.
Интересно, как вы заставляете это работать каждый раз, потому что вы записываете завершающий ноль за пределами размера массива, что приводит к неопределенному поведению.
Создание tmp[3]
и hash[8][33]
должно решить вашу проблему.
Для правильной работы функции strcat () необходимо иметь по крайней мере один нуль в массиве, к которому вы присоединяете, потому что в противном случае он не знал бы, куда объединить. Вы должны добавить хеш [k] [0] = 0; перед входом в каждый внутренний цикл:
for (int k = 0; k < 8; ++k)
{
hash[k][0] = 0;
for (int i = 0; i < 16; ++i)
{
sprintf(tmp,"%2.2x",hashResults[k][i]);
strcat(hash[k],tmp);
}
printf("%d \n%s\n", strlen(hash[k]), hash[k]);
}