Блокнот со звездочками в принтф? - PullRequest
4 голосов
/ 22 августа 2011

Я искал максимум и минимум, но в printf в C кажется, что заполнение только нулем и пробелами Я хочу написать свою собственную заливку, в данном случае используя звездочку.

Например,

Принимая ширину 8 символов.

Ввод: 123 Ouput: **123.00

Ввод: 3 Выход: ****3.00

Как я могу это сделать?

Ответы [ 3 ]

7 голосов
/ 22 августа 2011

Самый простой способ - это, вероятно, распечатать в буфер, используя snprintf() с пробелами, а затем заменить пробелы звездочками:

void print_padded(double n)
{
    char buffer[9];
    char *p;

    snprintf(buffer, sizeof buffer, "% 8.2f", n);
    for (p = buffer; *p == ' '; p++)
        *p = '*';
    printf("%s", buffer);
}
2 голосов
/ 22 августа 2011

Следующая программа демонстрирует один из способов сделать это:

#include <stdio.h>
#include <stdarg.h>

void padf (size_t sz, int padch, char *fmt, ...) {
    int wid;
    va_list va;

    // Get the width that will be output.

    va_start (va, fmt);
    wid = vsnprintf (NULL, 0, fmt, va);
    va_end (va);

    // Pad if it's shorter than desired.

    while (wid++ <= sz)
        putchar (padch);

    // Then output the actual thing.

    va_start (va, fmt);
    vprintf (fmt, va);
    va_end (va);
}

int main (void) {
    padf (8, '*', "%.2f\n", 123.0);
    padf (8, '*', "%.2f\n", 3.0);
    return 0;
}

Просто вызовите padf так же, как вы бы вызвали printf, но с дополнительными аргументами ширины начальных символов и отступов и изменением "реальный »формат, чтобы исключить начальные пробелы или нули, такие как изменение %8.2f на %.2f.

. Он будет использовать стандартные переменные аргументы, чтобы определить фактическую ширину аргумента, а затем вывести достаточно символов заполнениядобавьте это к желаемой ширине перед выводом фактического значения.В соответствии с вашими требованиями, выход вышеупомянутой программы:

**123.00
****3.00

Очевидно, что это решение накладывается слева - вы можете сделать его более общим и передать, хотите ли вы дополнить его влево или вправо (для чисел/ strings) но это, вероятно, выходит за рамки вопроса.

1 голос
/ 22 августа 2011

Создайте строку, используя snprintf, а затем проверьте ее длину.Для любых символов, которые не были заполнены, выведите звездочку перед печатью фактического буфера, который был заполнен snprintf.

Так, например:

#define STRINGSIZE 8

char buffer[STRINGSIZE + 1];
int length = snprintf(buffer, sizeof(buffer), "%#.2f", floating_point_value);

for (int i = STRINGSIZE - length; i > 0; i--)
{
    printf("*");
}

printf("%s\n", buffer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...