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


92

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

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

我如何获得这样的东西:

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

Answers:


159

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

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

然后将在该字段上打印的内容全部空白填充为您指定的宽度。

-左证明在该领域的文本。


130
,我还不够聪明,无法算得那么高。但是,我相信提问者足够聪明,可以从我的示例中推断出来:)
Carl Smotricz 09年

3
合理的权利怎么样?K&R
Ungeheuer

9
右对齐是默认设置。没有-,您的数据将在您指定宽度的字段中右对齐。
卡尔·斯莫特里奇

24

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


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

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


18

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

13

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

将打印任何长度的两个字符串的相同宽度的2列header1header2可具有。我不知道是否所有实现都具有,%n但是Solaris和Linux 都有。


该解决方案有效,但是任何接受此解决方案并将其放入代码中的人都应该意识到引入内存漏洞风险
马修·科尔

0

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


-2

首先使用制表符(\ t字符修饰符)。它会前进到一个固定的位置(列,终端术语)。但是,如果差异大于列宽度(4个字符,如果我没记错的话)的话,这无济于事。

要解决此问题,请使用固定数量的制表符(5?6 ?,尝试一下)来编写“ OK / NOK”内容,然后返回(\ r)而无需换行,并编写消息。


5
始终存在字符串长于制表位的危险,从而迫使生成的制表符和文本未对齐。
PP。

不太好...首先写选项卡的OK / NOK,然后是/ r,现在写短语,现在是/ n。该短语可能会覆盖OK / NOK。但是你的方法更好,我不知道消极的理由。
jpinto3912
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.