Отображение десятичных, восьмеричных и шестнадцатеричных - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь отобразить следующее меню, но когда я добавляю значение больше 3 цифр, интервал отключается.Какие-либо предложения?

Accumulator:
     Hex    :   0000
     Octal  :   00000000
     Decimal:   0

    void print_acc(short acc){
        printf("\n");
        printf("****************************************\n");
        printf("* Accumulator:                         *\n");
        printf("*   Hex     :   %04hx                   *\n", acc);
        printf("*   Octal   :   %08ho               *\n", acc);
        printf("*   Decimal :   %hd                    *\n", acc);
        printf("****************************************\n");

    }

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Вы можете индексировать в строку пробелов, чтобы изменить интервал в конце строк.Функцию 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                *
****************************************
0 голосов
/ 06 октября 2018

У вас нет определения ширины в вашем десятичном printf.В противном случае это просто выравнивает числа.Имейте в виду, что если ваш номер шире указанной ширины, интервал будет скорректирован, чтобы соответствовать большей ширине.

****************************************
* Accumulator:                         *
*   Hex     :   2ac0                   *
*   Octal   :   00025300               *
*   Decimal :   10944                    *
****************************************

Если вы добавите спецификатор ширины в десятичную и удалите 0, как показано ниже:

void print_acc(short acc){
    printf("\n");
    printf("****************************************\n");
    printf("* Accumulator:                         *\n");
    printf("*   Hex     :   %8hx               *\n", acc);
    printf("*   Octal   :   %8ho               *\n", acc);
    printf("*   Decimal :   %8hd               *\n", acc);
    printf("****************************************\n");
}

Вы выровняете все:

****************************************
* Accumulator:                         *
*   Hex     :       2c07               *
*   Octal   :      26007               *
*   Decimal :      11271               *
****************************************

Если вы хотите выровнять цифры по левому краю, добавьте перед спецификатором ширины (например,% -8hd).

...