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

5
问题是:
如何使用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个回答

9

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

 %A.B<format specifier>

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

现在引用C11标准,第§7.21.6.1章,fprintf()函数(本人强调):

每个转换说明符以字符%开头。在%之后,按顺序出现以下内容:

[...]

  • 可选精度,对于diouxX转换,给出要显示的最小位数;对于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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接