【问题标题】:Print all elements of an hex array in one line在一行中打印十六进制数组的所有元素
【发布时间】:2018-10-19 02:59:06
【问题描述】:

我在 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()

怎样才能达到要求?

【问题讨论】:

  • 在这种情况下提供 print() 函数的主体...

标签: c arrays hex


【解决方案1】:

您可以使用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;
}

【讨论】:

    【解决方案2】:

    您可以设计自己的函数来先构造一个字符串,然后立即打印它。你可以这样做:

    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);
    }
    

    这显然对字符宽度和编码做了一些假设。但你可以根据你的目标进行调整。

    这是一个有效的Demo

    【讨论】:

    • 您包含一个可以/应该避免的尾随空白,并将output 所需的分配减少1:char output[len*5];output[i*5-1] = '\0';
    • @JonathanLeffler 假设为len &gt; 0。我将在开头添加一个打印,以防 len 为 0,然后按照您的建议调整其余部分。
    • 是的;打印空数组并不令人兴奋,可以处理(例如assert(len &gt; 0);,或者如果您担心调试与生产,请使用assert(len &gt; 0); if (len == 0) return;)。
    【解决方案3】:

    到目前为止,最简单的方法就是使用递归。事实上,下面的程序可以进一步压缩,只使用 main 函数,并将索引声明为全局变量。

    #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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2012-04-22
      相关资源
      最近更新 更多