First of all, let me tell you, the code you have shown is about controlling the precision, not the field width. For a shortened form**
%A.B<format specifier>
A
denotes the field width and B
makes the precision.
Now, quoting the C11
standard, chapter §7.21.6.1, fprintf()
(emphasis mine)
Each conversion specification is introduced by the character %. After the %, the following
appear in sequence:
[..]
- An optional precision that gives the minimum number of digits to appear for the
d
, i
,
o
, u
, x
, and X
conversions, the number of digits to appear after the decimal-point
character for a
, A
, e
, E
, f
, and F
conversions, the maximum number of significant
digits for the g
and G
conversions, or the maximum number of bytes to be written for s
conversions. The precision takes the form of a period (.
) followed either by an
asterisk *
(described later) or by an optional decimal integer; if only the period is
specified, the precision is taken as zero. If a precision appears with any other
conversion specifier, the behavior is undefined.
and
As noted above, a field width, or precision, or both, may be indicated by an asterisk. In
this case, an int
argument supplies the field width or precision. [...]
So, in your case,
printf(""%.*s"
", i, text);
the precision will be supplied by i
which can hold different values at run-time.
The complete format (broken down in separate lines for ease of readability)
%
<Zero or more flags>
<optional minimum field width>
<optional precision>
<optional length modifier>
<A conversion specifier character>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…