printf with multiple columns
This function prints every number starting from 0000 to 1000.
#include <stdio.h>
int main() {
int i = 0;
while ( i <= 1000 ) {
printf( "%04d\n", i);
i = i + 1;
}
return 0;
}
The output looks like this:
0000
0001 0002 etc..How can I make this more presentable using three different columns (perhaps using \t ) to have t开发者_如何学运维he output look like this:
0000 0001 0002
0003 0004 0005 etc..This is how I'd do it, to eliminate the potentially expensive if
/?:
statement:
char nl[3] = {' ', ' ', '\n'};
while ( i <= 1000 ) {
printf("%04d%c", i, nl[i%3]);
++i;
}
Note that the modulo division may be much more expensive than the branching anyhow, but this depends on your architecture.
To get 3 columns you need to print new line character only after each 3 numbers (in your case after a number if its remainder when divided by 3 is 2):
The simplest approach:
while ( i <= 1000 ) {
if (i%3 == 2)
printf( "%04d\n", i);
else
printf( "%04d ", i);
i = i + 1;
}
Or as pointed in comment you can make it shorter using ternary operator:
while ( i <= 1000 ) {
printf("%04d%c", i, i%3==2 ? '\n' : ' ');
++i;
}
while ( i <= 1000 )
{
printf( i%3?"%04d ":"%04d\n", i );
++i;
}
should also works.
The only way I got it to work perfectly in terminal (console) was literally padding the string with a loop. The nice part is that you can choose which char to pad it with, like "Text .......... 234". Without manual padding most lines got aligned by printf, but a few remained little out of alignment.
# 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
The result is something like
Hey just this?..................................... 123456
Calm down, this text will be printed nicelly ...... 123
精彩评论