如何使用printf()实现变量字段宽度?

时间:2015-11-13 13:32:20

标签: c printf

问题是:

  

如何使用printf()实现变量字段宽度?也就是说,应该在运行时指定宽度而不是%8d

我在互联网上遇到了一些基于上述问题的C代码,但由于我不熟悉C编程,因此我无法对代码做出正面或反面。 我发布以下代码:

#include <stdio.h>

int main()
{
   const char text[] = "Hello world";
   int i;
   for ( i = 1; i < 12; ++i )
   {
      printf("\"%.*s\"\n", i, text);
   }


    return 0;
}

1 个答案:

答案 0 :(得分:7)

首先,让我告诉您,您展示的代码是关于控制精度,而不是字段宽度。对于缩短的形式 **

 %A.B<format specifier>

A表示字段宽度,B表示精度。

现在,引用C11标准,章节§7.21.6.1,fprintf()强调我的

  

每个转换规范都由字符%引入。在%之后,以下   按顺序出现:

     

[..]

     
      
  • 一个可选的精度,为di显示最小位数,   ouxX次转化,小数点后显示的位数   aAeEfF转换的字符数,最大重要数   gG次转化的数字,s次转化要写入的最大字节数。精度采用句点(.)的形式,后跟一个   星号*(稍后描述)或可选的十进制整数;如果只是时期   指定时,精度为零。如果精度与任何其他精度一起出现   转换说明符,行为未定义。
  •   

  

如上所述,字段宽度或精度或两者可以用星号表示。在   在这种情况下,int参数提供字段宽度或精度。 [...]

所以,在你的情况下,

printf("\"%.*s\"\n", i, text);

精度将由i提供,它可以在运行时保存不同的值。

完整格式(为便于阅读,在单独的行中分解)

%
<Zero or more flags>
<optional minimum field width>
<optional precision>
<optional length modifier>
<A conversion specifier character>