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