问题是 :
如何使用
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;
}
Run Code Online (Sandbox Code Playgroud)
首先,让我告诉你,你所展示的代码是关于控制精度,而不是字段宽度.对于缩短的形式**
%A.B<format specifier>
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
提供的精度i可以在运行时保持不同的值.
完整的格式(为便于阅读,在单独的行中分解)
%
<Zero or more flags>
<optional minimum field width>
<optional precision>
<optional length modifier>
<A conversion specifier character>
Run Code Online (Sandbox Code Playgroud)