Печать нескольких экземпляров числа или символа с использованием спецификаторов формата - PullRequest
0 голосов
/ 19 апреля 2019

Можно ли, например, напечатать более 1 числа, используя спецификаторы формата?

printf("%05d",5);

Это напечатает 00005

Есть ли способ заставить его напечатать ---- 5например, используя эти спецификаторы формата?

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Если вы можете использовать alloca, то не очень элегантное решение будет:

printf("%s%d", (char*)memset(memset(alloca(4), '\0', 4), '-', 3),5);

Если вы можете разрешить c ++, то вы можете попробовать это, что выглядит немного элегантнее:

printf("%s%d",std::string(3,'-').c_str(),5); 

Оба эти случая выдадут ---5

0 голосов
/ 19 апреля 2019

Вы не можете делать именно то, что вы хотите. Я думаю, что самое близкое что-то вроде этого:

#include <stdio.h>
#include <math.h>

// FILLER_DASH needs to be long enough for all use cases
const char *FILLER_DASH = "---------------------------------------------------";

int main(void) {

    const int field_width = 10;

    for (int number = 1 ; number < 1100000; number += (number + 90)) {
        // zero or negative numbers not supported by this simple formula
        int digits = log10(number) + 1;
        printf("%.*s%d\n", field_width - digits, FILLER_DASH, number);
    }
    return 0;
}

Он использует спецификатор формата * для получения ширины поля из аргументов, а затем использует строку для предоставления символов для печати. ​​

Он использует логарифм с основанием 10 для получения числа цифр с основанием 10 в числе, что включает неявное преобразование из int в double для функции логарифма, а затем обратно в int для printf формата. Этот логарифм определен только для положительных чисел (так что в этом случае целые числа 1 и выше), если вы хотите поддержку 0 или отрицательного числа, то их нужно обрабатывать как особые случаи (в основном это 3-х ветвь if-elseif-else).

...