C 程序 - 打印线性行和列的有效方法

C Program - Efficient way to Print the Linear Rows and Columns

我有如下数组,

 #define BASE_ADDRESSES  10

 int register_values[BASE_ADDRESSES] = {23, 12, 54, 16, 32, 44, 11, 38, 35, 52};

我想这样打印,

Base_Address   Hex_Values        ASCII_Values
------------   -----------       -------------
0x0000         17   0C  36       ')'  '6'  '*'
0x0003         10   20  2C       ' '  ','  '$'
0x0006         0B   26  23       '~'  '&'  '#'
0x0009         34                '4'

但它需要行格式和列格式,请提供 printf 格式以高效地完成此操作..

注意:ASCII 值不正确,仅举个例子.. 提前致谢

没有适合您的常规行和结尾行的 printf 格式。您必须逐个构建输出。您还应该在字符输出中考虑不可打印的字符和字符的特殊表示,例如 '\n'

这是一个 dump 例程,它将输出格式化为 col 列:

#include <stdlib.h>
#include <stdio.h>

static const char *special(int c)
{
    switch(c) {
    case '[=10=]':  return "'\0'";
    case '\a':  return "'\a'";
    case '\b':  return "'\b'";
    case '\n':  return "'\n'";
    case '\r':  return "'\r'";
    case '\t':  return "'\t'";
    case '\v':  return "'\v'";
    case '\'':  return "'\''";
    case '\':  return "'\\'";
    }

    return NULL;
}

static int unprintable(int c)
{
    return c < 32 || c > 126;
}

void dump(int arr[], size_t n, size_t col)
{
    size_t base = 0;

    while (n) {
        printf("%08zx        ", base);

        for (size_t i = 0; i < col; i++) {
            if (i < n) {
                printf("%02x ", arr[i]);
            } else {
                fputs("   ", stdout);
            }
        }

        printf("     ");

        for (size_t i = 0; i < col; i++) {
            if (i < n) {
                const char *p = special(arr[i]);

                if (p) {
                    printf("%-5s", p);
                } else if (unprintable(arr[i])) {
                    printf("0%03o ", arr[i]);
                } else {
                    printf("'%c'  ", arr[i]);
                }
            }
        }

        printf("\n");

        arr += col;
        n = (n < col) ? 0: n - col;
        base += col;
    }
}

并这样称呼它:

int main()
{
    int val[] = {23, 12, 54, 16, 32, 44, 11, 38, 35, 52};

    dump(val, 10, 3);

    return 0;
}