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

library(tidyverse)

col <- "cut"

foo <- function(df, col) {
  df %>% 
    mutate(!!sym(col) := tolower(!!sym(col)))
}

foo(diamonds, col)

Извлечь Передать строку как имя переменной в dplyr :: filter .

31
задан Ricardo Amaral 16 April 2009 в 20:22
поделиться

8 ответов

Поиск этого в моем удобном 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.

45
ответ дан 27 November 2019 в 21:35
поделиться

Почему 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]

РЕДАКТИРОВАТЬ: ответ на уточнение вопроса :

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

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

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

46
ответ дан 27 November 2019 в 21:35
поделиться
    printf("%8d\n",1);
    printf("%8d\n",10);
    printf("%8d\n",100);
    printf("%8d\n",1000);
3
ответ дан 27 November 2019 в 21:35
поделиться

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

1
ответ дан 27 November 2019 в 21:35
поделиться

Полностью непереносимое решение Linux:

#include <stdio.h>
#include <unistd.h>

int main()
{
  char buffer[BUFSIZ];
  readlink("/proc/self/exe", buffer, BUFSIZ);
  printf("%s\n", buffer);
}

Использует трюк "/ proc / self", который указывает на запущенный процесс. Таким образом, это избавляет от необходимости искать PID. Обработка ошибок оставлена ​​как упражнение для осторожных.

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

loop over data - get correct padding, put into width

printf( "%*d\n", width, datum );
0
ответ дан 27 November 2019 в 21:35
поделиться

Итак, вы хотите поле шириной 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();
}
0
ответ дан 27 November 2019 в 21:35
поделиться

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

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

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

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

0
ответ дан 27 November 2019 в 21:35
поделиться

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

Если вы не

0
ответ дан 27 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: