Вывести все элементы шестнадцатеричного массива в одну строку - PullRequest
0 голосов
/ 19 октября 2018

У меня есть массив в C char arr[100], каждый элемент которого может содержать произвольное шестнадцатеричное значение (даже 0).Я хочу как-то иметь возможность печатать этот массив в одну строку, например:

arr[0] = 0x11
arr[1] = 0x00
...
arr[99] = 0x22

Вывод должен быть:

0x11 0x00 ..... 0x22

Если я использую printf() с %s, он остановится на 0. Я не хочу использовать цикл for для печати каждого символа один за другим, используя %x.У меня есть ограничение на то, какой API я могу использовать из-за системы, над которой я работаю.Это не позволяет printf().Он имеет функцию print(), которая добавляет новую строку после каждой печати, но принимает строки формата, такие как %x, %s, %d и т. Д., Такие как printf().

Как может быть выполнено требование?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Самый простой способ - использовать рекурсию.Фактически, приведенная ниже программа может быть дополнительно сжата с помощью только основной функции и объявлением индекса как глобальной переменной.

#include <stidio.h>
//declare your array and its size as a global varaible
int arrSize = 5;
unsigned char arr[5] = {0x00, 0x11, 0x1F, 0x33, 0x34};

void recursion(int i) {
    if(i == 0){
        printf("0x%x0 ", arr[i]);
   }else{
       printf("0x%x ", arr[i]);
   }

   if(i < arrSize -1){ //at index i, if i is less than the length of your array
       i += 1;
       recursion(i); //then recurse to the next index
  }else{
       printf("\n");
  }
}

int main() {
    recursion(0); //call your recursive function in main()
}
0 голосов
/ 19 октября 2018

Вы можете использовать sprintf для копирования в буфер, а затем распечатать буфер

#include <stdio.h>

int main(void)
{
    char arr[] = { 0x11, 0x00, 0x22, 0xFF };

    int count = sizeof(arr);

    //each element needs 5 bytes
    char *buf = malloc(5 * count + 1);

    for(int i = 0; i < count; i++)
        sprintf(buf + i * 5, "0x%02X ", arr[i] & 0xFF);

    //optional: remove the last blank space
    buf[5 * count - 1] = 0;

    printf("[%s]\n", buf);//or whichever print function available

    return 0;
}
0 голосов
/ 19 октября 2018

Вы можете разработать свою собственную функцию, чтобы сначала создать строку, а затем сразу ее напечатать.Вы можете сделать это следующим образом:

void print_array(char arr[], int len) {
    if(len <= 0){
        print("");
        return;
    }
    char output[len*5];
    int i;
    for(i=0;i<len;i++) {
        output[i*5]='0';
        output[i*5+1]='x';
        int upper = (unsigned char)arr[i] / 16;
        int lower = (unsigned char)arr[i] % 16;
        output[i*5+2] = upper < 10?(upper + '0'):(upper-10+'a');
        output[i*5+3] = lower < 10?(lower + '0'):(lower-10+'a');
        output[i*5+4] = ' ';
    }
    output[i*5-1]=0;
    print("%s", output);
}

Это, очевидно, делает некоторые предположения о ширине символа и кодировках.Но вы можете настроить в соответствии с вашей целью.

Вот рабочая Демо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...