如何使用printf()格式化字符串以在输出中获得相等的长度?

时间:2009-11-27 15:38:55

标签: c string printf pretty-print

我有两个函数,一个生成Starting initialization...之类的消息,另一个生成检查返回代码并输出"Ok""Warning""Error"的函数。但是,生成的输出具有不同的长度:

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

我怎样才能得到这样的东西:

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

6 个答案:

答案 0 :(得分:136)

您可以在字符串字段上指定宽度,例如

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

然后用该字段打印的任何内容都将填空到您指定的宽度。

-左对齐该字段中的文字。

答案 1 :(得分:20)

printf允许使用宽度说明符进行格式化。 e.g。


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

您可以使用负宽度说明符来指示左对齐,因为默认值是使用右对齐。

答案 2 :(得分:15)

此外,如果您希望灵活选择width,您可以选择以下两种格式之一(有或没有截断):

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."

答案 3 :(得分:12)

还有%n修饰符可以在某些情况下提供帮助。它返回到目前为止字符串所在的列。示例:您希望像表格一样写入第一行宽度内的多个行。

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]);

将打印两列header1header2可能具有的相同宽度的列。 我不知道所有实现是否都有%n但是Solaris和Linux都有。

答案 4 :(得分:1)

还有一种相当低技术的解决方案,即手动添加空间以使您的消息排成一行。没有什么能阻止你在消息字符串中包含一些尾随空格。

答案 5 :(得分:-2)

首先使用Tabs, \ t 字符修饰符。它将前进到固定位置(列,终端术语)。 但是,如果存在大于列宽的差异(4个字符,如果我没记错的话),则无效。

要解决这个问题,请使用固定数量的Tabs(5?6 ?,试一试)写下你的“OK / NOK”内容,然后返回( \ r )而不用new-lining,然后写你的消息。