Функция strcat
предназначена для обработки строк, то есть символьных массивов с нулевым символом в конце. Поскольку ваш массив не заканчивается на ноль, вы не должны использовать эту функцию.
Вместо этого вы можете использовать функции memmove
и memset
, если хотите избежать ручного кодирования движения. Однако вам нужно объявить массив str
с подходящим (большим) размером (чтобы вместить добавленные байты). Так, например:
unsigned char str[7] = { 0x68, 0x65, 0x6C, 0x6C, 0x6F, }; // Note: size must be at least 7
//.. some code
memmove(str+2, str, 5); // Shift along by two bytes (see note, below)
memset(str, 0, 2); // Add the two 'prefix' zeros
Обратите внимание, что функция memmove
безопасна с перекрывающимися буферами (разметка):
Копирует значения количество байтов от местоположения, указанного источником, до блока памяти, указанного адресатом. Копирование происходит так, как если бы использовался промежуточный буфер, позволяя перекрывать место назначения и источник.
Однако это относится только к функции memmove
, а не к функции memcpy
. С функцией memcpy
небезопасно иметь перекрывающиеся буферы.
Также обратите внимание, что unsigned char *str
не объявляет массив (хотя вы можете использовать аналогичный синтаксис для строковых литералов ). Вам необходимо использовать (исправленную) версию опубликованного кода.