How to format strings using printf() to get equal length in the output?

我的梦境 提交于 2019-11-26 22:04:16

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.

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.

Additionally, if you want the flexibility of choosing the width, you can choose between one of the following two formats (with or without truncation):

int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization...     Ok."

//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 
// output is "Starting initialization... Ok."

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 whatever length the two strings header1 and header2 may have. I don't know if all implementations have the %n but Solaris and Linux do.

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.

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!