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

时间:2015-10-13 06:17:19

标签: c algorithm printf

我有一个如下数组,

RandomAccessIndexType

我想像这样打印,

 #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' 格式来有效地执行此操作..

注意:ASCII值不正确,例如.. 提前致谢

1 个答案:

答案 0 :(得分:1)

没有printf格式适合您的常规行和结束行。你必须逐个构造输出。您还应该在角色输出中满足不可打印的字符和字符的特殊表示,例如'\n'

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

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

static const char *special(int c)
{
    switch(c) {
    case '\0':  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;
}