Как выровнять такое число в C?

мне нужно выровнять ряд чисел в C с printf () такой пример:

-------1
-------5
------50
-----100
----1000

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

Я могу сделать только это:

----1---
----5---
----50--
----100-
----1000

или такой:

---1
---5
--50
-100
1000

но ничто из этого не то, что я хочу, и я не могу достичь того, что отображается на первый пример использования только printf (). Возможно ли это вообще?

EDIT:
Извините, люди, я спешил и не очень хорошо объяснился... Мой последний пример и все ваши предложения (использовать что-то вроде "%8d") не работают, потому что, хотя последнее число равно 1000, оно не обязательно идет до 1000 или даже 100 или 10.

независимо от количества цифр, которые будут отображаться, я хочу только 4 ведущих места не более для самого большого число. Предположим, я должен отображать цифры от 1 до 1000 (A) и от 1 до 100 (B), и я использую для обоих "%4d", это будет выход:

A:

---1
....
1000

выходной я хочу...

B:

---1
....
-100

который не является выходом, который я хочу, я на самом деле хочу этого:

--1
...
100

но, как я уже сказал, Я не знаю точное количество номеров, которые я должен напечатать, он может иметь 1 цифру, он может иметь 2, 3 или более, функция должна быть подготовлена для всех. И я хочу четыре дополнительных ведущих места, но это не так важно.

EDIT 2: Кажется, что то, что я хочу, так, как мне это нужно, невозможно (проверьте Дэвид Торнли и пустые ответы Ксавье и мои комментарии). Спасибо всем за уделенное время.

9 ответов


глядя на это в моем удобном Harbison & Steele....

определите максимальную ширину полей.

int max_width, value_to_print;
max_width = 8;
value_to_print = 1000;
printf("%*d\n", max_width, value_to_print);

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


Почему printf("%8d\n", intval); не работает для вас? Должно...

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

#include <stdio.h>

int
main(void)
{
        int i;
        for (i = 1; i <= 10000; i*=10) {
                printf("[%8d]\n", i);
        }
        return (0);
}

$ ./printftest
[       1]
[      10]
[     100]
[    1000]
[   10000]

EDIT: ответ на уточнение вопроса:

#include <math.h>
int maxval = 1000;
int width = round(1+log(maxval)/log(10));
...
printf("%*d\n", width, intval);

расчет ширины вычисляет базу журнала 10 + 1, которая дает количество цифр. Фантазия * позволяет использовать переменную для значения в строке формата.

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


    printf("%8d\n",1);
    printf("%8d\n",10);
    printf("%8d\n",100);
    printf("%8d\n",1000);

насколько я могу судить из вопроса, то отступ необходимо будет варьироваться в зависимости от данных. Соответственно, единственное решение для этого-сканировать данные перед печатью, вычислять самые широкие данные и находить значение ширины, которое можно передать в printf с помощью оператора asterix, например

loop over data - get correct padding, put into width

printf( "%*d\n", width, datum );

попробуйте преобразовать в строку, а затем использовать "%4.4 s" в качестве спецификатора формата. Это делает его фиксированным форматом ширины.


Итак, вы хотите 8-символьное широкое поле с пробелами в качестве заполнения? Попробуйте "%8d". вот ссылка.

редактировать: то, что вы пытаетесь сделать, не может быть обработано только printf, потому что он не будет знать, какое самое длинное число вы пишете. Вам нужно будет вычислить наибольшее число, прежде чем делать какие-либо printfs, а затем выяснить, сколько цифр использовать в качестве ширины поля. Затем вы можете использовать snprintf или подобного формат printf на месте.

char format[20];
snprintf(format, 19, "%%%dd\n", max_length);
while (got_output) {
    printf(format, number);
    got_output = still_got_output();
}

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

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

Как только у вас есть данные, то это просто после обработки его в отчет с помощью идиома printf("%*d", width, value) для каждого значения.

в качестве альтернативы, если выходной канал разрешает случайный доступ, вы можете просто пойти вперед и написать черновик отчета, который предполагает (короткую) ширину по умолчанию, и искать и редактировать его в любое время, когда ваше предположение о ширине нарушается. Это также предполагает, что вы можете заполнить строки отчета за пределами этого поля каким-то безобидным способом или что вы готовы заменить вывод до сих пор процессом чтения-изменения-записи и отказаться от файла Черновика.

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


глядя на отредактированный вопрос, вам нужно найти количество цифр в наибольшем количестве, которое будет представлено, а затем сгенерировать printf() формат с использованием sprintf(), или с помощью %*d С количеством цифр, передаваемых в качестве int для * и затем значение. После того, как у вас есть наибольшее число (и вы должны определить это заранее), вы можете определить количество цифр с помощью алгоритма "целочисленного логарифма" (сколько раз вы можете разделить на 10, прежде чем добраться до нуля), или с помощью snprintf() С длиной буфера, равной нулю, формат %d и null для строки; возвращаемое значение говорит вам, сколько символов было бы отформатировано.

если вы не знаете и не можете определить максимальное число перед его появлением, вы snookered - нет ничего, что вы можете сделать.


#include<stdio.h>
int main()
{
 int i,j,n,b;
 printf("Enter no of rows ");
 scanf("%d",&n);
 b=n;
 for(i=1;i<=n;++i)
 {
    for(j=1;j<=i;j++)
    {
        printf("%*d",b,j);
        b=1;
    }
        b=n;
    b=b-i;
    printf("\n");


 }
 return 0;
}