问题在于转换说明符
%7.d
:对于整数转换
精确
后面的字段
.
是要生成的最小位数(用前导零填充)。如果未指定
。
,默认值为
1
但是
。
号码是
0
如果后面没有数字
。
0
精确
是值
0
被转换为空字符串。移除
。
以解决此问题。
C标准描述了中的转换说明符
7.23.6.1 fprintf功能
这样:
每个转换规范都由字符介绍
%
%
,按顺序显示以下内容:
零或更多
旗帜
(以任何顺序)修改转换规范的含义。
可选最小值
字段宽度
如果转换后的值的字符数少于字段宽度,则在字段宽度的左侧(或右侧,如果已给出稍后描述的左侧调整标志)填充空格(默认情况下)。字段宽度采用星号形式
*
(稍后描述)或非负十进制整数。
可选
精确
为
b
,
d
,
i
,
o
,
u
,
x
和
X
conversions,显示在的小数点字符后面的位数
a
,
A
,
e
,
E
,
f
和
F
转换
g
和
G
转换,或要写入的最大字节数
s
转换。精度采用周期的形式(
。
)后面跟一个星号
*
(稍后描述)或通过可选的非负十进制整数;如果只指定了周期,则精度为零。如果精度与任何其他转换说明符一起出现,则该行为是未定义的。
可选
长度修饰符
指定参数的大小。
A.
转换说明符
指定要应用的转换类型的字符。
在里面
%7.d
,没有
旗帜
这个
字段宽度
是
7
这个
精确
是
0
(因为
如果只指定周期,则精度为零
),没有
长度修饰符
以及
转换说明符
是
d
用于转换
int
作为其十进制表示。
对于整数转换,
精确
确定最小位数(用多余的数字左填充数字
0
在符号之后(如果有的话),而
字段宽度
指定要输出的最小字符数,符号前用空格填充。
示例:
int main() {
for (int i = -10; i <= 10; i += 1) {
printf("|%5d|%5.d|%5.0d|%5.1d|%5.2d|%.5d|%05d|\n", i, i, i, i, i, i, i);
}
return 0;
}
输出:
| -10| -10| -10| -10| -10|-00010|-0010|
| -9| -9| -9| -9| -09|-00009|-0009|
| -8| -8| -8| -8| -08|-00008|-0008|
| -7| -7| -7| -7| -07|-00007|-0007|
| -6| -6| -6| -6| -06|-00006|-0006|
| -5| -5| -5| -5| -05|-00005|-0005|
| -4| -4| -4| -4| -04|-00004|-0004|
| -3| -3| -3| -3| -03|-00003|-0003|
| -2| -2| -2| -2| -02|-00002|-0002|
| -1| -1| -1| -1| -01|-00001|-0001|
| 0| | | 0| 00|00000|00000|
| 1| 1| 1| 1| 01|00001|00001|
| 2| 2| 2| 2| 02|00002|00002|
| 3| 3| 3| 3| 03|00003|00003|
| 4| 4| 4| 4| 04|00004|00004|
| 5| 5| 5| 5| 05|00005|00005|
| 6| 6| 6| 6| 06|00006|00006|
| 7| 7| 7| 7| 07|00007|00007|
| 8| 8| 8| 8| 08|00008|00008|
| 9| 9| 9| 9| 09|00009|00009|
| 10| 10| 10| 10| 10|00010|00010|