问题是:
如何使用
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;
}
答案 0 :(得分:7)
首先,让我告诉您,您展示的代码是关于控制精度,而不是字段宽度。对于缩短的形式 **
%A.B<format specifier>
A
表示字段宽度,B
表示精度。
现在,引用C11
标准,章节§7.21.6.1,fprintf()
(强调我的)
每个转换规范都由字符%引入。在%之后,以下 按顺序出现:
[..]
- 一个可选的精度,为
d
,i
显示最小位数,o
,u
,x
和X
次转化,小数点后显示的位数a
,A
,e
,E
,f
和F
转换的字符数,最大重要数g
和G
次转化的数字,或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>