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

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

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

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

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

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

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

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

在这个领域里,你左边的文字是正确的。

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

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

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

还有%n修饰符可以在某些情况下提供帮助。 它返回string到目前为止的列。 例如:您想要像表格一样写入第一行宽度内的几行。

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

将打印2个与header1header2可能具有的长度相同的任何长度的列。 我不知道是否所有的实现都有%n但是Solaris和Linux是这样做的。

此外,如果您想要selectwidth的灵活性,您可以select以下两种格式之一(带或不带截断):

 int width = 30; //no truncation printf( "%-*s %s\n", width, "Starting initialization...", "Ok." ); //truncated to the specified width printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 

还有一个相当低科技的解决scheme,可以手工添加空间,使您的信息排列起来。 没有什么能阻止你在消息string中包含几个尾随空格。

首先使用Tabs, \ t字符修饰符。 它将推进到一个固定的位置(专栏,terminal术语)。 但是,如果存在超过列宽的差异(4个字符,如果我没有记错的话),这并没有帮助。

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