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

我有两个函数,一个产生类似 Starting initialization...的消息,另一个检查返回码并输出 "Ok""Warning""Error"。然而,产出的长度不同:

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

How can I get something like the following?

Starting initialization...       Ok.
Checking init scripts...         Ok.
178431 次浏览

您可以指定字符串字段的宽度,例如。

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

然后用这个字段打印的内容将被空白填充到您指定的宽度。

-向左-证明您在该字段中的文本是正确的。

printf允许使用宽度说明符进行格式化,

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

您将使用负宽度说明符来指示左对齐,因为默认情况下使用右对齐。

Start with the use of 标签 - the T character modifier. It will advance to a fixed location (columns, terminal lingo).

但是,如果差异超过了列宽(如果我没记错的话,是4个字符) ,那就没有用了。

为了解决这个问题,可以使用固定数量的选项卡(5?6号?试试看)。然后返回(R)没有新的衬里,并写您的消息。

还有一个相当低技术含量的解决方案,手工计算添加的空间,使您的信息排成一行。没有什么可以阻止您在消息字符串中包含一些尾随空格。

还有 %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,但是 索拉里斯和 Linux 有。

此外,如果你想灵活地选择 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."