%*.*d如何在printf()中工作?

And*_*y.G 6 c c++ printf

#include <stdio.h>

int main()
{
  printf("%*.*d\n", -6 , 7,20000);
  printf("%*.*d\n", 5, -6, 2000);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0020000
 2000
Run Code Online (Sandbox Code Playgroud)

我不明白如何printf解释格式说明符*.*

在第一次打电话中printf(),后来的7是否会覆盖前-6?那么输出宽度的大小变为7?

R..*_*R.. 8

*前面的参数.字段宽度,*后面的参数.精度.

字段宽度是转换后输出的最小字节数; 如果将产生更少的字节,则输出将被填充(默认情况下,左侧带有空格,但左侧填充和右侧空间填充也是选项,由标志控制).*for宽度的负参数被解释为带有-标志的相应正值,它将填充向右移动(即左对齐字段).

另一方面,精度具有根据所执行的转换而变化的含义.消极精度被视为根本没有指定精度.对于整数,它是要生成的最小位数(不是总输出); 如果生成的数字较少,则向左添加零.显式精度为0会导致值为0时不生成数字(而不是生成单个数字0).对于字符串,精度限制输出字节数,必要时截断字符串(并允许更长,非空终止的输入数组).对于浮点说明符,精度控制打印的位数,在小数点之后(for%f)或总重要地点(对于其他格式).

在你的例子中:

printf("%*.*d\n", -6 , 7,20000);
Run Code Online (Sandbox Code Playgroud)

这里的字段是左对齐的(右边的填充),最小宽度为6,但是字段最终会变宽,所以忽略宽度.7的精度强制整数输出至少为7位,因此您最终得到0020000的转换字段内容已超出宽度.

在另一个:

printf("%*.*d\n", 5, -6, 2000);
Run Code Online (Sandbox Code Playgroud)

字段宽度为5,默认右对齐; 填充左侧有空格.否定精度被忽略,就像没有指定一样,因此转换后的字段内容2000只有4个字节,最多填充5个字节以通过单个前导空格填充宽度.

  • @unwind:我故意使用"字节"这个词.它不是"数字",因为宽度计算符号,小数点(浮点数)等对总数的影响,对于基数点为多字节字符的区域设置,每个字节将计入宽度.注意,在C标准中,"字节"和"字符"是等价的; 我避免使用"字符"这个词,因为由于多字节字符,它对大多数人来说都很模糊.POSIX将这些函数的规范中对"字符"的所有引用更改为"字节"以避免混淆. (6认同)
  • +1,但我认为它应该是"字符"或"数字",而不是"字节". (2认同)