Если вы хотите использовать как строковый литерал, так и избежать добавления дополнительного терминатора (символа NUL), сделайте это следующим образом:
static const char str[4] = "\x1\x5\xa\x15";
Когда длина строкового литерала точно совпадает с объявленной длиной массива символов, компилятор не добавляет завершающий символ NUL.
Следующая тестовая программа:
#include <stdio.h>
int main(void)
{
size_t i;
static const char str[4] = "\x1\x5\xa\x15";
printf("str is %zu bytes:\n", sizeof str);
for(i = 0; i < sizeof str; ++i)
printf("%zu: %02x\n", i, (unsigned int) str[i]);
return 0;
}
Печатает это:
str is 4 bytes:
0: 01
1: 05
2: 0a
3: 15
Я не понимаю, почему вы бы предпочли использовать этот метод, а не гораздо более читаемый и поддерживаемый оригинальный с шестнадцатеричными числами, разделенными запятыми, но, возможно, ваша настоящая строка также содержит обычные печатаемые символы или что-то в этом роде.