printf с несколькими столбцами - PullRequest
1 голос
/ 31 августа 2010

Эта функция печатает каждый номер, начиная с 0000 до 1000.

#include <stdio.h>

int main() {
    int i = 0;
    while ( i <= 1000 ) {
        printf( "%04d\n", i);
        i = i + 1; 
    }
    return 0;
}

Вывод выглядит так:

0000
0001
0002
и т.д ..

Как я могу сделать это более презентабельным, используя три разных столбца (возможно, используя \ t), чтобы выходные данные выглядели так:

0000 0001 0002
0003 0004 0005
и т.д ..

Ответы [ 4 ]

5 голосов
/ 31 августа 2010

Вот как я бы это сделал, чтобы исключить потенциально дорогой оператор if / ?::

char nl[3] = {' ', ' ', '\n'};
while ( i <= 1000 ) {
   printf("%04d%c", i, nl[i%3]);
   ++i; 
}

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

3 голосов
/ 31 августа 2010

Чтобы получить 3 столбца, вам нужно печатать символ новой строки только после каждых 3 цифр (в вашем случае после числа, если его остаток при делении на 3 равен 2):

Самый простой подход:

while ( i <= 1000 ) {
    if (i%3 == 2)
       printf( "%04d\n", i);
    else
       printf( "%04d ", i);
    i = i + 1; 
}

Или, как указано в комментарии, вы можете сократить его, используя троичный оператор:

while ( i <= 1000 ) {
   printf("%04d%c", i, i%3==2 ? '\n' : ' ');
   ++i; 
}
1 голос
/ 31 августа 2010
while ( i <= 1000 )
{
   printf( i%3?"%04d ":"%04d\n", i );
   ++i;
}

также должно работать.

0 голосов
/ 27 января 2017

Единственный способ заставить его работать идеально в терминале (консоли) - это буквально заполнить строку циклом. Приятной особенностью является то, что вы можете выбрать, какой символ дополнить его, например, «Текст .......... 234». Без ручного заполнения большинство строк выравнивалось с помощью printf, но некоторые оставались немного не выровненными.

  # This gets available cols in terminal window:
  w_cols=`tput cols`

  col2=15
  let "col1=($w_cols - $col2)"

  small="Hey just this?"
  bigone="Calm down, this text will be printed nicelly"     
  padchar='.'

  let "diff=${#bigone} - ${#small}"

  for ((i=0; i<$diff; i++)); 
    do
       small="${small}$pad_char"
    done

 # The '-' in '%-80s' below makes the first column left aligned.
 # Default is right all columns:

  printf "%-${col1}s\t%${col2}d\n"  "$small"  123456
  printf "%-${col1}s\t%${col2}d\n"  "$bigone"  123

В результате получается что-то вроде

  Hey just this?.....................................   123456
  Calm down, this text will be printed nicelly ......      123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...