了解 printf 格式规范中的 %03.3u
Understand %03.3u in printf format specification
我正在使用printf来输出内容。现在我在另一个人的代码中看到格式规范为"%03.3u",根据我的理解,点之前的"03"已经将输出的宽度指定为 3 位,如果没有 3,则用零填充,而点后面的"3"也指定应该有 3 位数字输出。因此,点之前似乎有"03",点后面的"3"是重复的。
我进行以下测试:
char l[50];
sprintf(l, "%03.3u", 5);
sprintf(l, "%03u", 5);
sprintf(l, "%.3u", 5);
并确认输出始终为005。那么为什么其他人应该使用"%03.3u"而不是"%03u"或"%.3u"呢?
对于您使用的特定值,输出将是相同的。.
前面的数字是最小字段宽度,而之后的数字(至少对于u
转换说明符(是要输出的最小位数。您可以通过以下方式查看两者之间的区别:
printf("%3.2un", 7)
这为您提供space07
- 最少两位数输出和至少三个字符宽。
但是,数字相同的事实意味着您将在至少三个字符宽的字段中至少获得三位数字。即使您使用了%03.2u
(不同的最小值(,该0
的存在也意味着用0
而不是space
左键,因此您仍然会看到005
。
底线是,要获得完整的三位数字,您可以使用0
零键盘修饰符或最小位数修饰符,但您不需要两者。
但是,由于两者兼而有之除了迫使人们质疑编写它的人的理智之外,不会产生任何不利影响:-(,因此在功能上是可以的。
03
是带有零填充的字段宽度。这意味着至少要输出 3 个字符,如果少于 3个字符,则左键为零。
第二个3
是要输出的最小位数。
当同时指定这两个值时,将应用精度,如果结果小于最小字段宽度,则将填充输出。例如,printf("q%6.3u", 5)
将产生q 005
。 (我使用q
因为堆栈溢出格式会吃掉空格(。
如果要打印无符号整数并且未使用符号标志,则位数与字段宽度相同(因为唯一的输出是数字(。%03u
、%.3u
和%03.3u
都有相同的效果。
我猜这个人写%03.3u
因为他们没有正确理解这些东西的含义,所以他们猜到了一些东西,它奏效了,他们决定不做任何进一步的改变。
如果您打印符号字符,则字段宽度与数字计数不同,例如,您可以尝试使用%+3u
与%+.3u
。或者,如果您使用%d
并打印负数。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 在提升multi_index容器中,是否定义了"default index"?
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- enum是C++中的宏变量还是整数变量
- 在C++/Linux中设置单调时钟的一些技巧
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 大量序列中核苷酸类型的快速计数
- 将字符串存储在c++中的稳定内存中
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 向量范数的c++中的||运算符
- C++中的无穷范数函数
- 了解 printf 格式规范中的 %03.3u
- 特征中范数、归一化和归一化之间的区别