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

标签 c++ c printf

#include <stdio.h>

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

输出:

0020000
 2000

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

在第一次调用 printf() 时,后面的 7 会覆盖前面的 -6 吗?使得输出宽度的大小变为7?

最佳答案

. 之前的* 的参数是字段宽度* 之后的参数.精度

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

另一方面,

精度 的含义随执行的转换而变化。负精度被视为根本没有指定精度。对于整数,它是要生成的最小位数(不是总输出);如果产生的数字较少,则在左侧添加零。显式精度 0 导致在值为 0 时不生成任何数字(而不是生成单个 0)。对于字符串,精度限制 输出字节数,必要时截断字符串(并允许更长的、非空终止的输入数组)。对于浮点说明符,精度控制打印的位数,无论是在小数点之后(对于 %f)还是有效总位数(对于其他格式)。

在你的例子中:

printf("%*.*d\n", -6 , 7,20000);

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

另一个:

printf("%*.*d\n", 5, -6, 2000);

字段宽度为5,默认右对齐;填充在左边有空格。负精度被忽略,就好像没有指定一样,所以转换后的字段内容是2000,只有4个字节,通过一个前导空格填充到5个字节来填充宽度.

关于c++ - %*.*d 在 printf() 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17566886/

相关文章:

bash - 填充的 printf 格式字符串没有使用多字节字符添加足够的填充

c++ - 高分辨率显示器导致MFC中View文字模糊

c++ - 如何在Windows异常处理程序中设置MMX寄存器以模拟不受支持的3DNow!指示

c - 堆栈的链表,head->next 不断变为 null

haskell - 在 Haskell 中将元组的元素作为参数提供给函数?

c - 在 Windows 中,如何阻止 fprintf 将\r 与\n 一起打印到文件

c++ - 在 C++ 代码中将 size_t 变量与 -1(最大大小值)进行比较

c++ - 找到多重定义的符号?

c++ - 错误: cast from ‘void*’ to ‘int’ loses precision [-fpermissive] in makefile

c - 使用指针写入/读取文件,C