如何使用printf()格式化字符串以在输出中获得相等的长度?
-
05-07-2019 - |
题
我有两个函数,一个产生消息,如 Starting initialization ...
,另一个用于检查返回代码并输出" Ok"
,"警告“
或”错误“
。但是,生成的输出具有不同的长度:
Starting initialization...Ok.
Checking init scripts...Ok.
我怎样才能得到这样的东西:
Starting initialization... Ok.
Checking init scripts... Ok.
解决方案
您可以在字符串字段上指定宽度,例如
printf("%-20s", "initialization...");
然后用该字段打印的任何内容都将填空到您指定的宽度。
-
左对齐该字段中的文字。
其他提示
printf
允许使用宽度说明符进行格式化。 e.g。
printf( "%-30s %s\n", "Starting initialization...", "Ok." );
您可以使用负宽度说明符来指示左对齐,因为默认值是使用右对齐。
此外,如果您希望灵活选择 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."
还有%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个相同宽度的列,两个字符串 header1
和 header2
可能具有的长度。
我不知道所有实现是否都有%n
,但Solaris和Linux都有。
还有一种相当低技术的解决方案,即手动添加空间以使您的消息排成一行。没有什么能阻止你在消息字符串中包含一些尾随空格。
首先使用Tabs, \ t 字符修饰符。它将前进到固定位置(列,终端术语)。 但是,如果存在大于列宽的差异(4个字符,如果我没记错的话),则无效。
要解决这个问题,请写下“OK / NOK”。使用固定数量的Tabs(5?6 ?,试试),然后返回( \ r )没有新内容的东西,并写下你的消息。
不隶属于 StackOverflow