Вы можете индексировать в строку пробелов, чтобы изменить интервал в конце строк.Функцию snprintf()
можно использовать для непосредственного определения количества отображаемых символов для каждого номера, используя номер, возвращаемый при вызове snprintf()
.
Вот пример программы, которая выводит список номеровв каждой из баз.snprintf()
возвращает количество символов, которые будут записаны в выходной массив, если он будет достаточно большим;здесь этот массив temp[]
может содержать 64 символа или до 63 цифр (поскольку snprint()
всегда записывает нулевой терминатор).Это должно быть более чем достаточно, чтобы избежать проблем, но даже если число слишком велико, чтобы поместиться в массив temp[]
, snprintf()
не приведет к переполнению буфера, а возвращаемое число все равно будет правильным количеством символовбыть записанным.
Как только количество символов в каждом из форматов отображения определено, это число используется для индексации в строке пробелов, так что все концы строки выровнены.Обратите внимание на оператор assert()
, включенный, чтобы быть уверенным, что отображаемое наибольшее число не настолько велико, что арифметика указателя выходит за конец массива spaces[]
.
#include <stdio.h>
#include <assert.h>
#define TEMP_SZ 64
int main(void)
{
enum bases { OCTAL, DECIMAL, HEX };
short arr[] = { 0, 16, 256, 512, 1024, 16384 };
size_t arr_sz = sizeof arr / sizeof *arr;
for (size_t i = 0; i < arr_sz; i++) {
int num_sz[3];
int num = arr[i];
char temp[TEMP_SZ];
/* Find width of number display */
num_sz[DECIMAL] = snprintf(temp, TEMP_SZ,"%hd", num);
num_sz[OCTAL] = snprintf(temp, TEMP_SZ, "%08ho", num);
num_sz[HEX] = snprintf(temp, TEMP_SZ, "%04hx", num);
/* Strings to precede termination of display lines */
char stars[] = "*********************";
char spaces[] = " ";
/* Avoid undefined behavior */
assert((size_t) num_sz[OCTAL] < (sizeof spaces / sizeof *spaces));
puts("");
printf("******************%s*\n", stars);
printf("* Accumulator: %s*\n", spaces);
printf("* Hex : %04hx%s*\n", num, spaces + num_sz[HEX]);
printf("* Octal : %08ho%s*\n", num, spaces + num_sz[OCTAL]);
printf("* Decimal : %hd%s*\n", num, spaces + num_sz[DECIMAL]);
printf("******************%s*\n", stars);
}
return 0;
}
Вывод программы:
****************************************
* Accumulator: *
* Hex : 0000 *
* Octal : 00000000 *
* Decimal : 0 *
****************************************
****************************************
* Accumulator: *
* Hex : 0010 *
* Octal : 00000020 *
* Decimal : 16 *
****************************************
****************************************
* Accumulator: *
* Hex : 0100 *
* Octal : 00000400 *
* Decimal : 256 *
****************************************
****************************************
* Accumulator: *
* Hex : 0200 *
* Octal : 00001000 *
* Decimal : 512 *
****************************************
****************************************
* Accumulator: *
* Hex : 0400 *
* Octal : 00002000 *
* Decimal : 1024 *
****************************************
****************************************
* Accumulator: *
* Hex : 4000 *
* Octal : 00040000 *
* Decimal : 16384 *
****************************************