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;
}
我有如下数组,
#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;
}