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

C 如何使用printf()格式化字符串以在输出中获得相等的长度,c,string,printf,pretty-print,C,String,Printf,Pretty Print,我有两个函数,一个生成消息,如开始初始化…,另一个检查返回代码并输出“Ok”,“Warning”或“Error”。但是,产生的输出具有不同的长度: Starting initialization...Ok. Checking init scripts...Ok. 我怎样才能得到像下面这样的东西 Starting initialization... Ok. Checking init scripts... Ok. 您可以指定字符串字段的宽度,例如 printf(&q

我有两个函数,一个生成消息,如
开始初始化…
,另一个检查返回代码并输出
“Ok”
“Warning”
“Error”
。但是,产生的输出具有不同的长度:

Starting initialization...Ok.
Checking init scripts...Ok.
我怎样才能得到像下面这样的东西

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

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

printf("%-20s", "initialization...");
然后,用该字段打印的任何内容都将空白填充到您指定的宽度


左边的
-
会对该字段中的文本进行对齐。

printf
允许使用宽度说明符进行格式设置。比如说,

printf( "%-30s %s\n", "Starting initialization...", "Ok." );
您可以使用负宽度说明符来指示左对齐,因为默认情况下使用右对齐。

首先使用制表符-字符修饰符。它将前进到一个固定的位置(列、终端行话)

但是,如果差异大于列宽(如果我没有记错的话,则为4个字符),则没有帮助


要解决这个问题,请使用固定数量的标签(5?6?,试试)写下你的“OK/NOK”内容。然后返回(\r)而不使用新的行线,然后写下您的消息。

还有一种技术含量较低的解决方案,即手工计算并添加空格,使您的消息排列整齐。没有任何东西可以阻止您在消息字符串中包含一些尾随空格。

还有
%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]);
int-width1,width2;
整数值[6][2];
printf(“|%s%n |%s%n |\n”,标题1和宽度1,标题2和宽度2);

对于(i=0;i此外,如果您希望灵活选择
宽度
,您可以选择以下两种格式之一(带或不带截断):


总是有这样一种危险,字符串比制表符长度长,从而导致制表符和文本对齐错误。不是真的……先写制表符OK/NOK,然后/r,现在写短语now/n。短语可能会覆盖OK/NOK。但是你的方法更好,我不知道负对齐。唉,我不够聪明然而,我相信提问者足够聪明,可以从我的例子中推断:)那么正确的解释呢?在K&RRight中没有提到任何标志,这是默认设置。如果没有
-
,您的数据将在指定宽度的字段中正确对齐。此解决方案有效,但任何将其放入代码中的人都应该知道。
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."