форматирование вывода с помощью c - PullRequest
1 голос
/ 16 декабря 2009

У меня есть несколько выходов, которые мне нужно распечатать как столбцы рядом. Есть ли способ достичь этого с помощью C? что-то вроде вывода ls -a т.е. я хочу напечатать данные первого столбца, затем второй и т. д.

Ответы [ 6 ]

6 голосов
/ 16 декабря 2009

Вы можете сделать это с форматными строками.
Для получения дополнительной информации см. Справочную страницу printf (3) .

5 голосов
/ 16 декабря 2009

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

3 голосов
/ 16 декабря 2009

РЕДАКТИРОВАТЬ (изменяя весь мой ответ):

Для форматов, которые вы получаете бесплатно с помощью printf (включая некоторые из них, связанные с длиной): http://www.cplusplus.com/reference/clibrary/cstdio/printf/

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

ПРАВИЛЬНО ОБОСНОВАННЫЙ (8 - ширина, s означает строку, | - просто показать интервал):

printf("|%8s|%8s|","try","this");

приведет к этому:

|     try|    this|

LEFT JUSTIFY (- означает выравнивание по левому краю, 8 - ширину, s - строку,> - просто показать интервал):

printf("%-8s%-8s>","try","this");

приведет к этому:

try     this    >
2 голосов
/ 16 декабря 2009

Если вы имеете в виду автоматический расчет количества столбцов и их ширины и т. Д., Вы не сможете сделать это только с printf(). Тем не менее, можно добавить дополнительный код для предварительного вычисления количества и ширины столбцов. Например, рассмотрим код OpenBSD для ls.

1 голос
/ 16 декабря 2009

Позвольте мне убедиться, что я понимаю; у вас есть код вроде

while (some_condition)
{
  bread();
  bwrite();
  pgsize();
}

и вы хотите отобразить выходы этих функций как

bread    bwrite    pgsize
1234     5678      1024
2345     6789      1024

Это близко к тому, что вы имели в виду?

Если так, то у вас есть пара вариантов. Сначала каждая функция печатает свой вывод, но без новой строки:

void bread()
{
  ...
  printf("%*.*d", field_width, precision, value);
  fflush(stdout)
  ...
}

где field_width - минимальная ширина столбца, precision - минимальное количество печатаемых цифр, а value - независимо от того, какая функция печатается. * в спецификаторе преобразования позволяет передавать ширину и точность в качестве аргументов в printf (), т.е.

printf("%*.*f", 10, 2, 3.14159);

совпадает с

printf("%10.2f", 3.14159);

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

Либо последняя вызванная функция, либо вызывающая сторона должна записать новую строку в выходной поток.

Альтернативно, вы можете сделать так, чтобы каждая функция возвращала вызывающей стороне свое значение и позволяла вызывающей стороне делать весь вывод:

while (some_condition)
{
  int r = bread();
  int w = bwrite();
  int s = pgsize();
  printf("%*.*d%*.*d%*.*d\n", rwidth, rprec, r, wwidth, wprec, w, swidth, sprec, s);
}

где rwidth, rprec и т. Д. Были объявлены и установлены в другом месте.

0 голосов
/ 16 декабря 2009

с использованием "\t" и "\n"

Пример:

for(int i = 0 ; i < m ; ++i)
{
  for(int j = 0; j < n ; ++j
 {
    printf("%d\t", a[i][j]);
 }
 printf("\n");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...