106

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

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

我怎样才能得到类似下面的东西?

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

6 回答 6

180

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

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

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

-左对齐您在该字段中的文本。

于 2009-11-27T15:42:31.420 回答
28

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

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

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

于 2009-11-27T15:43:42.807 回答
23

此外,如果您希望灵活选择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."
于 2015-03-05T04:49:39.983 回答
15

还有一个%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]);

将打印两个相同宽度的两列,无论两个字符串的长度如何,header1并且header2可能具有。我不知道是否所有实现都有%n,但Solaris和 Linux 有。

于 2009-11-28T19:31:13.133 回答
0

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

于 2009-11-27T15:44:15.457 回答
-2

从使用制表符开始- \t字符修饰符。它将前进到一个固定的位置(列,终端术语)。

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

要解决这个问题,请使用固定数量的选项卡(5?6?,试试看)写你的“OK/NOK”东西。然后在没有换行符的情况下返回(\r),并写下您的信息。

于 2009-11-27T15:43:59.033 回答