Подтвердить что ты не робот

Как выровнять число, подобное этому в 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", это будет выход:

А:

---1
....
1000

Какой результат я хочу...

В:

---1
....
-100

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

--1
...
100

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

ИЗМЕНИТЬ 2: Кажется, что я хочу, как мне это нужно, это невозможно (проверьте ответы Дэвида Торнли и Бланка Ксавьера и мои комментарии). Спасибо всем за ваше время.

4b9b3361

Ответ 1

Глядя на мои удобные Харбисон и Стил....

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

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.

Ответ 2

Почему 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, которая дает количество цифр. Необычный * позволяет использовать переменную для значения в строке формата.

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

Ответ 3

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

Ответ 4

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

Ответ 5

Как ваш последний пример не то, что вы хотите? Просто потому, что достаточное количество ведущих пробелов на 1000?

Ответ 6

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

EDIT. То, что вы пытаетесь сделать, - это не то, что может быть обработано только 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();
}

Ответ 7

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

loop over data - get correct padding, put into width

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

Ответ 8

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

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

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

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

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

Ответ 9

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

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

Ответ 10

#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;
}