我用星号表示字段宽度时,怎么少了一个space?

When I use the asterisk to indicate the field width, how come it is missing one space?

printf("12345678\n");
printf("%*c%*c, 2, 'a', 2, 'b');

在控制台上,我预计 a 会低于 3b 会低于 6,因为我的理解是我指出了两个空格在每个字符之前。但是,输出显示 a 低于 2 并且 b 低于 4.

原因是格式说明符前面的数字定义了字段宽度,而不是边距或填充。在格式 %ns 中,其中 n 是一个整数,s 是您选择的说明符,n 定义您为要替换的内容保留 n 个空格说明符与。也就是说,如果替换说明符的信息需要多于 n 个空格,它将占用所需的空间。

因此,如果您希望字母 ab 出现在 36 下方,您需要为每个字母保留三个空格而不是两个。

printf("%*c%*c, 3, 'a', 3, 'b');