%*.*d 在 printf() 中是如何工作的
How does %*.*d work in printf()?
#include <stdio.h>
int main()
{
printf("%*.*dn", -6 , 7,20000);
printf("%*.*dn", 5, -6, 2000);
return 0;
}
输出:
0020000
2000
我不明白printf
如何解释格式说明符 * . * ?
在第一次调用 printf()
时,后面的 7 会覆盖前 -6 吗?所以输出宽度的大小变成7?
.
之前*
的参数是字段宽度,.
后*
的参数是精度。
字段宽度是转换后将输出的最小字节数;如果生成的字节较少,则输出将被填充(默认情况下,左侧带有空格,但左零填充和右侧空格填充也是选项,由标志控制(。宽度*
的负参数被解释为带有 -
标志的相应正值,这会将填充向右移动(即左对齐字段(。
另一方面,精度的含义根据正在执行的转换而变化。负精度被视为根本没有指定精度。对于整数,它是要生成的最小位数(而不是总输出(;如果生成的数字较少,则在左侧添加零。显式精度为 0 会导致在值为 0 时不生成任何数字(而不是生成单个0
(。对于字符串,精度会限制输出字节数,必要时截断字符串(并允许更长的非以 null 结尾的输入数组(。对于浮点说明符,精度控制在基数点之后打印的位置数(对于 %f
(或总重要位置(对于其他格式(。
在您的示例中:
printf("%*.*dn", -6 , 7,20000);
此处的字段是左对齐的(右侧填充(,最小宽度为 6,但该字段最终会变宽,因此宽度将被忽略。精度 7 强制整数输出至少为 7 位,因此您最终会得到 0020000
作为转换后的字段内容,这已经超出了宽度。
在另一个中:
printf("%*.*dn", 5, -6, 2000);
字段宽度为 5,默认右对齐;填充在左侧带有空格。负精度将被忽略,就好像没有指定一样,因此转换后的字段内容2000
,只有 4 个字节,最多填充 5 个字节,以通过单个前导空格填充宽度。
printf("%*.*dn", -6 , 7,20000);
与
printf("%-6.7dn, 20000);
这只是为动态格式提供了一种方式。
这是 glibc 中 printf 的源代码
/* VARARGS1 */
int __printf (const char *format, ...)
{
va_list arg;
int done;
va_start (arg, format);
done = vfprintf (stdout, format, arg);
va_end (arg);
return done;
}
如您所见,printf 从va_list获取参数
这是另一个示例,向您展示 printf 的工作原理:
/* va_start example */
#include <stdio.h> /* printf */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
void PrintFloats (int n, ...)
{
int i;
double val;
printf ("Printing floats:");
va_list vl;
va_start(vl,n);
for (i=0;i<n;i++)
{
val=va_arg(vl,double);
printf (" [%.2f]",val);
}
va_end(vl);
printf ("n");
}
int main ()
{
PrintFloats (3,3.14159,2.71828,1.41421);
return 0;
}
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?