tags:

views:

169

answers:

5

I have two functions, one which produces messages like "Starting initialization..." and the other which cheks return codes and outputs "Ok\n", "Warning\n", or "Error\n". However, produced output is of the different length:

Starting initialization...Ok.
Checking init scripts...Ok.

How can I get smth. like that:

Starting initialization...       Ok.
Checking init scripts...         Ok.

Thanks in advance!

+8  A: 

You can specify width on string fields, e.g.

printf("%-20s", "initialization...");

and then whatever's printed with that field will be blank-padded to the width you indicate.

The - left-justifies your text in that field.

Carl Smotricz
The example input strings are longer than 20 characters..
PP
Alas, I'm not clever enough to count that high. However, I trust the asker to be intelligent enough to extrapolate from my example :)
Carl Smotricz
+5  A: 

printf allows formatting with width specifiers. e.g.


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

You would use a negative width specifier to indicate left-justification because the default is to use right-justification.

PP
A: 

Start with the use of Tabs, the \t character modifier. It will advance to a fixed location (columns, terminal lingo). However, it doesn't help if there are differences of more than the column width (4 characters, if I recall correctly).

To fix that, write your "OK/NOK" stuff using fixed number of Tabs (5? 6?, try it), then return (\r) without new-lining, and write your message.

jpinto3912
There's always the danger that a string is longer than a tab stop thereby forcing the resulting tab and text to be mis-aligned.
PP
it doesn't work !
psihodelia
Not really... first write the tabbed OK/NOK, then /r, now write the phrase, now /n. The phrase could overwrite the OK/NOK.But your way is way better, I didn't know about negative justification.
jpinto3912
@Carl, thanks, I keep doing this mistake...
jpinto3912
@psihodelia, yep, 'cause I had / iso \... my bad.
jpinto3912
A: 

There's also the rather low-tech solution of counting adding spaces by hand to make your messages line up. Nothing prevents you from including a few trailing spaces in your message strings.

Carl Smotricz
A: 

There's also the %n modifier which can help in certain circumstances. It returns the column on which the string was so far. Example: you want to write several rows that are within the width of the first row like a table.

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

will print 2 columns of the same width of wahatever length the two strings header1 and header2 may have. I don't know if all implementations have the %n but Solaris and Linux do.

tristopia